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
、このルートには行きたくありません。