ちょっとググってなかったので、自分用にメモ
TextureViewはSurfaceTextureListener
を持っていて、そのInterfaceの1つonSurfaceTextureAvailable
は、TextureViewのSurfaceTextureが使用できる状態になると呼び出されます。たいていは、このコールバックが呼べれたときにカメラの初期等を行うかと思います。
今回は、タイトル通りこのコールバックが呼ばれない事象と遭遇しました。
検証環境
- Nexus 5X (8.0)
- Docomo Galaxy S8+ (7.0)
解決法
AndroidManifest.xml
...
<application
android:hardwareAccelerated="false"
...
この項目があるとonSurfaceTextureAvailable
リスナーが呼ばれず、いつまでのカメラの初期化処理を呼ぶ事ができずに、黒い画面が表示されてしまいます。
そのときにlogcatに
W/TextureView: A TextureView or a subclass can only be used with hardware acceleration enabled.
というWarningが出るので、そこであたりはつけられると思います。
この事象で注意が必要な事は、端末の開発者向けオプション
>ハードウェアアクセラレーテッドレンダリング
>GPUレンダリングを使用
にチェックが入っていると、描画されてしまう事です。
端末によって問題の切り分けが難しくなってしまいますので、気をつけてください。
という事でandroid:hardwareAccelerated="false"
を削除したらプレビューが表示されました。