6

2 つのタブ (アクティビティ) を持つタブ アクティビティがあります。各タブには、カメラ プレビュー付きの SurfaceView の上に描画された 3D Open GL シーンがあります。

ただし、デバイスの向きによっては、タブが切り替わります。

問題は、他のアクティビティが開始されたときに camera.open() が呼び出され、カメラ サービスが利用できないという例外が生成されることです。

実際、問題は、アクティビティが一時停止されたときにカメラが停止しないことです。つまり、SurfaceView に対して onSurfaceDestroyed() が呼び出されません。アクティビティの onPause() が呼び出されたときにカメラを停止しようとしましたが、それでも同じエラーが発生します。

タブ付きアクティビティで同じ問題が発生した人はいますか? サーフェスビューを破壊する方法はありますか?

4

3 に答える 3

7

この質問は非常に人気があるようですので、もう一度ここに解決策を追加します。

根本的な原因は、アプリが一時停止されたときに SurfaceView に対して surfaceDestroyed が呼び出されなかったことです。

したがって、すべての子ビューを含むフレームレイアウトを作成しました。コンテンツ ビューとして設定します。onPause() で setVisibility(View.GONE) を呼び出し、onResume() で View.Visible を呼び出すだけでカメラを停止します。これにより、SurfaceView が破壊されます。

于 2014-03-07T06:40:07.500 に答える
3
private SurfaceHolder.Callback mSurfaceHolderListener = new SurfaceHolder.Callback() {

    public void surfaceDestroyed(SurfaceHolder holder) {
        Log.e("TABACT", "surfaceDestroyed()");
        camera.stopPreview();
        camera.setPreviewCallback(null); 
        camera.release();
        camera = null;
    }
于 2011-11-25T06:56:03.573 に答える