2011-06-29 9 views
7

私はカメラのプレビューを表示するアプリケーションを持っています。私は、スリープ状態にしてからスリープ状態にしてから、アプリケーションを正常に復帰させることができるようにします。問題は、スリープから復帰したときにカメラのプレビューが再開しないということです。カメラのプレビューをスリープ状態から復旧する方法は?

私はapiのデモで紹介されているようにカメラのプレビューを実装しましたが、apiのデモのサンプルは単なる運勢でしか動作しないようです。この例では、画面の向きが強制的に横向きになっています。つまり、ロック画面がポートレートモードになっているため、電話がスリープ状態になるたびに設定変更が行われます。ポートレイトモードが(私のような)カメラプレビューアプリケーションで使用されていると、バグが浮き彫りになります。

私はバグが表面ビューのレクリエーションに関連していることを知りました。 onPauseに移動してからonResumeの後に再作成すると、サーフェスは常に破棄されますが、スリープ状態になるときには発生しません。アクティビティ全体を破棄してからカメラのプレビューを再作成する必要があります。私は表面ビューを再現できるようにしたいと思います。

アクティビティ全体を再作成する以外に、サーフェイスビューの再作成を強制する方法はありますか?

答えて

5

1つの解決策は、表面の外観を不可視に設定し、再びonResume()で見ることができます。これにより、表面ビューが破棄されて再作成されます。

+0

+1ありがとうございました。本当に助かりました!しかし、カメラの実装では、バイト配列を渡して、失敗したバインダーになったので、カメラを呼び出したアクティビティに元のバイト配列を戻す代わりに、私が取得&保存したイメージのFile Uriを渡さなければなりませんでしたスリープ後のトランザクション。 – AgentKnopf

+0

Jasonのソリューションは4.0とそれ以降のデバイスでも機能しましたが、3.0とそれ以下のデバイスは同じ症状を示しています。任意のヒント? – rotinegg

3

私は同じ問題を抱えて、ここ理由ですれました:onPauseメソッドは、私が作ったCameraPreviewクラス(つまり、SurfaceViewコールバックを実装)をリサイクルしません

。代わりに、再その全体オブジェクト自体をインスタンス化しようとしているのは、私は単に私が再度カメラを初期化するためにgetCameraInstanceメソッドを呼び出し、私はそれが

null 

または

cameraPreview.setCamera(mCamera); 

のいずれかに渡したカメラオブジェクト参照を更新しますそれをpreivewオブジェクトに渡しました。

が今の問題はここにある:onResumeで

private void initializeCameraView(){ 

    RelativeLayout preview = (RelativeLayout)rootView.findViewById(R.id.camera_preview); 

    preview.addView(cameraPreview); 
} 

、私は再cameraPreviewオブジェクトを初期化するために、このメソッドを呼び出しました。 しかし、プレビュービューに別のcameraPreviewを追加しようとしていたため、フリーズしていました。これは私の修正、平易でシンプルなものでした。既に存在する場合は削除してから、すぐに戻してください。これが役立つことを願っています!

private void initializeCameraView(){ 

    RelativeLayout preview = (RelativeLayout)rootView.findViewById(R.id.camera_preview); 
    //removes the problem with the camera freezing onResume 
    if(cameraPreview != null) { 
     preview.removeView(cameraPreview); 
    } 
    preview.addView(cameraPreview); 
} 
+0

これは、スリープ状態にならずに3日間私を悩ませた問題に対する答えです:Dありがとう! –

+0

なぜこの回答に投票しませんか?それは私を助ける! – DYS

関連する問題