スマホアプリ開発つまずきポイント:コールバックのハンドラー設定~金宏和實「作ればわかる!Androidプログラミング」

  金宏和寛著「作ればわかる!Androidプログラミング」で、スマーホアプリを勉強中です。最新版で対応していない部分について、修正方法を記します。
 今回は、第7章で発生した、コールバックの設定に関わる不具合です。

 ※使用環境:2021年12月時点(Android Studio Arctic Fox 2020.3.1 Patch 4)API31
20211220z7a999.jpg


★Kotlinバージョンアップで、プログラムが動かない!
スマホアプリの作成に挑戦中です。以下の書籍に沿って、学んでいます(購入時の記事は、→こちら)。
・金宏和實著:作ればわかる!Androidプログラミング・Kotlin対応~10の実践サンプルで学ぶAndroidアプリ開発入門、2019/6、翔泳社
20211209za01.jpg

 開発環境の導入から、プログラミング、実機への導入まで、ひととおりの手順が書かれていて、とても分かりやすく実用的な書籍です。ただ、残念なことに、一部のソースコードが、そのままでは動きません。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)」に赤波線が出る(下図-下)。
20211220z7a130.jpg
20211220z7a131.jpg

◎原因
 以下ルールへの違反。(開発環境の仕様変更と思われる。)
1)Handlerでは、引数の明示が必要。
2)理論上nullの可能性がある変数を非nullとして扱うときは、明示が必要。

◎対策1)Handlerの引数
 1)については、Handlerの引数の明示が必要です。下図のように、「Looper.getMainLooper()」を引数とします。

cameraManager.registerTorchCallback( object:CameraManager.TorchCallback(){
...
}, Handler(Looper.getMainLooper() )

20211220z7a121.jpg

 上の修正について説明します。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()
  }
}

20211220z7a122.jpg

◎補足:bindingによるview参照
 完全動作のためには、上に加えて、「Android-Kotlin拡張プラグイン」廃止対応として、「binding」を用いる修正が必要です。詳しい修正方法は、別記事(→こちら)を参照ください。

◎補足2:Service版の修正
 7章のプログラムには、サービスを使用したアプリ「Bata Pika Ever」もあります。p.221 リスト7.6においても、上と同様の修正を行うことで、動作可能になります。
 ただし、サービス版については、アプリがバックグラウンドに入ると動作しない、という不具合を発見しています(Android11・API30の実機にて)。これについては、別途対策を記事にする予定です。


 これにて完動!
20211220z7a999.jpg

Comments

Popular posts from this blog

Privacy Policy: LifePointer - a life counter for TCGs

Privacy Policy: Absolute FFT - visualize frequency of sounds

Privacy Policy: Head or Tail? - An App for Tossing Coins