Android

TextureViewでonSurfaceTextureAvailableが呼ばれないときにチェックする事

ちょっとググってなかったので、自分用にメモ:pencil:

TextureViewはSurfaceTextureListenerを持っていて、そのInterfaceの1つonSurfaceTextureAvailableは、TextureViewのSurfaceTextureが使用できる状態になると呼び出されます。たいていは、このコールバックが呼べれたときにカメラの初期等を行うかと思います。
今回は、タイトル通りこのコールバックが呼ばれない事象と遭遇しました。

:four_leaf_clover: 検証環境

  • Nexus 5X (8.0)
  • Docomo Galaxy S8+ (7.0)

:hammer: 解決法

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"を削除したらプレビューが表示されました。

:paperclip: Refs