スマホアプリ開発つまずきポイント:コールバックのハンドラー設定~金宏和實「作ればわかる!Androidプログラミング」
金宏和寛著「作ればわかる!Androidプログラミング」で、スマーホアプリを勉強中です。最新版で対応していない部分について、修正方法を記します。
今回は、第7章で発生した、コールバックの設定に関わる不具合です。
※使用環境:2021年12月時点(Android Studio Arctic Fox 2020.3.1 Patch 4)API31
★Kotlinバージョンアップで、プログラムが動かない!
スマホアプリの作成に挑戦中です。以下の書籍に沿って、学んでいます(購入時の記事は、→こちら)。
・金宏和實著:作ればわかる!Androidプログラミング・Kotlin対応~10の実践サンプルで学ぶAndroidアプリ開発入門、2019/6、翔泳社
開発環境の導入から、プログラミング、実機への導入まで、ひととおりの手順が書かれていて、とても分かりやすく実用的な書籍です。ただ、残念なことに、一部のソースコードが、そのままでは動きません。2019年6月の発刊であり、現在までに開発言語「Kotlin(コトリン)」が何度もバージョンアップされていることが原因です。
2021年12月時点の環境(Android
Studio Arctic Fox 2020.3.1 Patch 4 API31
Platform)で動作するように、修正をしながら試しています。解決した部分は、当ブログに書きます。同様のエラーでお困りの方に、お役に立てば幸いです。(勉強中の人が書いています。ご指摘などありましたら、ぜひコメントください。)
★第7章:Callback、Handler設定のエラー
◎使用環境
・開発環境:Android Studio Arctic Fox 2020.3.1 Patch 4 / API31 Platform
・実機:スマートフォン OPPO CPH2099
◎不具合発生箇所
・対象コード:第7章 p.213 リスト7.4 MainActivity.kt
◎発生状況
以下エラーにより、ビルドが完了しない。
1)registerTorchCallbackの引数「Handler()」が取り消し線で消される(下図-上)。
2)if文中の「.setTorchMode(cameraID,false)」に赤波線が出る(下図-下)。
◎原因
以下ルールへの違反。(開発環境の仕様変更と思われる。)
1)Handlerでは、引数の明示が必要。
2)理論上nullの可能性がある変数を非nullとして扱うときは、明示が必要。
◎対策1)Handlerの引数
1)については、Handlerの引数の明示が必要です。下図のように、「Looper.getMainLooper()」を引数とします。
cameraManager.registerTorchCallback( object:CameraManager.TorchCallback(){ ... }, Handler(Looper.getMainLooper() ) |
上の修正について説明します。Handlerとは、複数のプログラム間をやりとりするためにシステム(Android)が用いる関数らしいです。そして、やりとりの送受信先として、いつも待ち構えているのがLooperらしいです。「registerTorchCallback」の引数は、新しいコールバック先「CameraManager.TorchCallback()」と、それを扱うためのハンドラー「Handler()」です。従来の書式ルールでは、Handlerの引数(対象となるLooper)を省略できました。しかし、現バージョンでは、省略不可です。「Looper.getMainLooper()」で、Handlerの連携先のLooper(現在使っているLooper)を、明示的に指定しなければなりません。
◎対策2)変数を非nullとして扱う
次に2)の修正です。ここは、エラーの出る「cameraID」の後ろに、「!!」を追加します(下図)。合計3箇所ありますが、最初の1個だけを示しました。この「!!」は、「non-null assertion」と言って、「nullでないことが前提である」ことを明示する演算子です。(上のif文で、not nullが保証されているので、ここはnullにはならないはずです。しかし、エディターの書式チェックがそこまで考慮していないのだと思われます。また、!!付与を強制することで、nullの例外処理(if文)漏れを防止できるメリットもありそうです。)
if(cameraID!=null){ try{ if(lightOn){ cameraManager.setTorchMode(cameraID!!, false) } }catch (e]CameraAccessException){ e.printStackTrace() } } |
◎補足:bindingによるview参照
完全動作のためには、上に加えて、「Android-Kotlin拡張プラグイン」廃止対応として、「binding」を用いる修正が必要です。詳しい修正方法は、別記事(→こちら)を参照ください。
◎補足2:Service版の修正
7章のプログラムには、サービスを使用したアプリ「Bata Pika Ever」もあります。p.221 リスト7.6においても、上と同様の修正を行うことで、動作可能になります。
ただし、サービス版については、アプリがバックグラウンドに入ると動作しない、という不具合を発見しています(Android11・API30の実機にて)。これについては、別途対策を記事にする予定です。
これにて完動!
Comments
Post a Comment