4

CameraViewを拡張するカスタム カメラ プレビュー ビューを作成し、インターフェイスSurfaceViewも実装していSurfaceHolder.Callbackます。ビューはカメラで動作します。ビューを開くと、カメラのプレビューが表示されます。同じ画面には、「写真を撮る」、「ギャラリーから選択する」という 2 つのボタンを備えたオーバーレイもあります。およびメソッドCameraViewでカメラを解放して再度開くアクティビティを保持します。onPause()onResume()

[ギャラリーから選択] ボタンをクリックすると、次のインテントが作成されます。

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent, LOAD_PICTURE);

このインテントに応答できるアクティビティが 1 つしかない場合は問題ありません。アクティビティが自動的に開かれ、カメラが解放されます。また、ギャラリーにいるときに反撃することもできますCameraView。アクティビティに戻ると、カメラのプレビューが復元されます。

このインテントを処理できるアクティビティが複数ある場合、興味深い部分が始まり、インテント チューザー ダイアログがポップアップします。インテント チューザー ダイアログが生成onPause()され、親アクティビティで呼び出され、カメラが解放されると、画面が黒くなります。ダイアログから意図を選択せず​​、代わりに電話の戻るボタンをクリックするonResume()と呼び出されますが、カメラのプレビューは戻ってきません。カメラ プレビューを再度表示するには、前のアクティビティに戻り、プレビュー アクティビティ内に戻る必要があります。

次の問題は、ダイアログが発生したときにonPause()呼び出されるだけで、実際に別のアクティビティに切り替えると呼び出されるために発生しsurfaceDestroyed()ます。onResume()ダイアログが戻るボタンでキャンセルされ、呼び出されないsurfaceChanged()場合も同様です。surfaceCreated()

私の質問は、インテント チューザー ダイアログがキャンセルされた場合にカメラ プレビューを再表示する方法です。SurfaceHolder.Callbackメソッドを明示的にトリガーする方法はありますか? hideSurface()hiddenとshowSurface()inがあることは知っていますがSurfaceView、このルートには行きたくありません。

4

1 に答える 1

0

そうです、onStart メソッドでカメラを開き、アクティビティの onStop メソッドでそれを解放しました。メソッド onResume と onPause は、Android アクティビティの目に見えるライフサイクルの一部です。OnStop は、別のアクティビティが表示スペース全体を占有するときに呼び出されます。OnPause は、インテント チューザー ダイアログがポップアップしたときのように、別のアクティビティが表示スペース全体を占めていなくても、別のアクティビティがフォアグラウンドになったときに呼び出されます。したがって、カメラの作成とリリースを正しいライフサイクル メソッドに移行することでうまくいくと思います。アクティビティ ライフサイクルの詳細については、こちらを参照してください。

http://developer.android.com/reference/android/app/Activity.html

于 2013-10-11T07:48:43.690 に答える