最近Android TVアプリの開発で困ったこと
雑にメモ
Android TVを正確に判定するのが難しい
Android DevelopersのAndroid TV実装ガイドにはTV端末をチェックするという項目があり、
UI_MODE_TYPE_TELEVISIONで判定すればいいよと書いてある。
しかし実際にはUI_MODE_TYPE_TELEVISIONなのにAndroid TVではない端末いくつかあり、自称AndroidTV端末としてチェックをすり抜けてしまう。
特にOSが4.x系でUI_MODE_TYPE_TELEVISIONな端末が曲者で、Android TVだけを想定してコードを書いていると4.x系では存在しないAPIにアクセスしてクラッシュすることがあって非常に辛い。
手元にないので試せていないが、おそらくHDMIスティック系の端末にも自称TV端末があるのではなかろうか。
TV判定のロジックにAPIレベルのチェックを追加するか、TV向けの部分であってもminSdkVersionで動くようにしておいたほうが良さそう。
結局、Android TVってUI_MODE_TYPE_TELEVISIONができたAPI level 13からサポート対象なのか、leanbackライブラリのv17からサポート対象なのか、Android TVそのものができたLollipopからサポート対象なのかよくわからない。
音声検索のマイク権限は外せる
AndroidTVで検索画面を実装する場合、通常はleanbackライブラリのSearchFragment/SearchSupportFragmentを利用する。
このクラスは普通に実装するとRECORD_AUDIO権限が必要だが、SpeechRecognitionCallbackを設定して音声検索をACTION_RECOGNIZE_SPEECHに任せれば権限不要となる。
Android Developers Blogにも書いてあったので多分間違いない。
TVでRuntime permissionsに対応するのはしんどいので、どんどん権限を外していきたい。
Leanbackライブラリの更新で死ぬ
leanback-v17ライブラリを23系にあげたときに、HorizontalGridViewのlayout_heightをwrap_contentにしているとjava.lang.IllegalStateException: Must specify rowHeight or view heightみたいなエラーを吐いてクラッシュする。
おそらくVerticalGridViewのlayout_widthでも似たようなエラーが発生してクラッシュしそう。
メッセージの通り高さ/幅を指定すればクラッシュしなくなる。