38

テクスチャ ビューを使用して、Android アプリでカメラのプレビューを表示しています。ただし、アプリが一時停止されるたびに、次のエラーが発生することに気付きました。

03-18 18:23:44.315: W/BufferQueue(19582): [unnamed-19582-20] cancelBuffer: BufferQueue has been abandoned!

誰かがここで何が起こっているのか教えてもらえますか? 私のアプリが一時停止するとき、私がすることは、次のようなすべてを初期化することだけですonSurfaceTextureDestroyed()

 public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
    mCamera.setPreviewCallback(null);
    mCamera.stopPreview();
    mCamera.release();
    return true;
}
4

1 に答える 1

54

あなたがやっていることは基本的にTextureView docsに書かれていることなので、うまくいくはずです。

このエラー メッセージは、(カメラ)の「プロデューサー」側がBufferQueueバッファを取得し、( を介してcancelBuffer())取得を解除しようとしていることを意味します。ただし、「消費者」側 ( SurfaceTexture) はなくなりました。「消費者」側がキューを所有しているため、キューBufferQueueは放棄されたと見なされ、それ以上の操作はできません。

これは単なるタイミングの問題のように思えます。プロデューサーは、SurfaceTextureが破棄された後に操作を実行しようとしています。でプロデューサをシャットダウンしておりonSurfaceTextureDestroyed()、そのコールバックが を返さない限り ST は解放されないため、これは意味がありませんtrue。(コールバック メソッドの最初と最後にログ メッセージを追加し、「放棄された」苦情がそれらの前または後に発生するかどうかを確認すると興味深い場合があります。logcat -v threadtimeスレッド ID を確認するために使用します。)

だから、なぜこれが起こっているのかよくわかりません。幸いなことに、アプリケーションに悪影響を与えるべきではありません。プロデューサは、コンシューマがなくなったことを正しく判断し、文句を言いますがクラッシュはしません。だからうるさいけど爆発しない。

不思議なことに、 Grafikaで「ライブ カメラ (TextureView)」を実行すると、デバイスからこのようなメッセージが表示されますか? そのアクティビティはTextureViewドキュメントからそのまま出てきており、自分のデバイスで実行しても何の不満もありません。

(SurfaceTexture と BufferQueue に関する追加情報については、こちらを参照してください。)

于 2014-03-18T20:45:34.260 に答える