1

変更が必要なアプリケーションからいくつかのコードを継承しました (yuck)。問題のアクティビティは、SurfaceHolder.Callback と SensorEventListener を実装しています。このアクティビティは、カスタム カメラ用です。

このコードは、オートフォーカスと写真撮影に問題なく機能します。写真を撮ったら、結果を得るために別のアクティビティを開始して、画像をトリミングします。そのアクティビティが開始されるとすぐに、surfaceDestroyed の SurfaceHolder.Callback が呼び出されます (予想どおり)。この時点で、既存のアプリケーションはカメラを解放します (予想どおり)。ただし、新しいクロップ アクティビティが開始されると、元のカメラ アクティビティは停止します (スタック トレース: Instrumentation.callActivityOnStop->Activity.performStop)。

編集: アクティビティの onStop が呼び出されたときにスタック トレースを完了します。

CameraActivity.onStop() line: 784      
Instrumentation.callActivityOnStop(Activity) line: 1219
CameraActivity(Activity).performStop() line: 5186      
ActivityThread.performStopActivityInner(ActivityThread$ActivityClientRecord, ActivityThread$StopInfo, boolean, boolean) line: 3003     
ActivityThread.handleStopActivity(IBinder, boolean, int) line: 3052    
ActivityThread.access$1000(ActivityThread, IBinder, boolean, int) line: 139    
ActivityThread$H.handleMessage(Message) line: 1251     
ActivityThread$H(Handler).dispatchMessage(Message) line: 99    
Looper.loop() line: 137
ActivityThread.main(String[]) line: 4918       
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method] 
Method.invoke(Object, Object...) line: 511     
ZygoteInit$MethodAndArgsCaller.run() line: 1004
ZygoteInit.main(String[]) line: 771    
NativeStart.main(String[]) line: not available [native method] 

このため、カメラ アクティビティはアクティブではなくなり、トリミング アクティビティからの結果を受け取りません。

サーフェスを破壊する/カメラを解放すると、カメラ アクティビティが停止するのはなぜですか? ここで何かが欠けているに違いない...

4

2 に答える 2

0

そこで、このような状況で通常行うことを行い、問題を単純化しようとしました。Android 開発者サイトのガイドに従って、まったく新しいプロジェクトを作成しました: http://developer.android.com/guide/topics/media/camera.html#custom-camera

写真を撮るための新しいシンプルなアプリケーションを入手したら、クロップ アクティビティを呼び出すように変更しましたが、問題なく動作しました。

サンプル アプリケーションの最大の違いは、別の CameraPreview クラスを使用して SurfaceHolder.Callback を実装したことです。私のアプリケーションでは、そのインターフェイスをアクティビティに直接実装していました。それが本当の問題かどうかはわかりませんが、それを行うようにコードを変更すると、うまくいくように見えました。

したがって、誰かが私にそれをよりよく説明できない限り、修正はアクティビティに SurfaceHolder.Callback を実装しないことです。

于 2013-05-09T15:24:44.690 に答える
0

startActivityForResult に渡されるリクエスト コードが肯定的であることを確認してください。そうしないと、アクティビティが結果を取得しません。これは、以前私を噛んだ API の奇妙な部分です。

ドキュメントを引用するには: https://developer.android.com/reference/android/app/Activity.html#startActivityForResult

requestCode >= 0 の場合、このコードは、アクティビティの終了時に onActivityResult() で返されます。

一般に、アクティビティがフォアグラウンド アクティビティでない場合はいつでも onStop を呼び出すことができます。これにより、アクティビティ結果の受信が妨げられることはありません。結果を受け取るためにアクティビティを再開できます。

http://developer.android.com/guide/components/activities.html

また、タスク アフィニティとバック スタックに注意を払い、クロップ アクティビティが同じタスクの一部として実行されていることを確認してください。これは、アクティビティが停止しないようにするのに役立ちますが、保証はありません。

http://developer.android.com/guide/components/tasks-and-back-stack.html

于 2013-05-08T16:56:00.663 に答える