1

我从需要修改的应用程序中继承了一些代码(恶心)。有问题的活动实现了 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

确保传递给 startActivityForResult 的请求代码是肯定的,否则您的活动将不会得到结果。这是之前困扰我的 API 的一个奇怪部分:

引用文档:https ://developer.android.com/reference/android/app/Activity.html#startActivityForResult

requestCode 如果 >= 0,则活动退出时会在 onActivityResult() 中返回此代码。

通常,只要您的活动不是前台活动,就可以调用 onStop。这并不妨碍接收活动结果。可以重新启动 Activity 以接收结果。

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 回答
0

所以,我做了我在这种情况下通常会做的事情,并试图简化问题。我按照 android 开发者网站上的指南创建了一个全新的项目:http: //developer.android.com/guide/topics/media/camera.html#custom-camera

一旦我获得了新的简单应用程序来拍照,我对其进行了修改以调用裁剪活动,并且它可以正常工作。

示例应用程序之间最大的不同在于它使用单独的 CameraPreview 类来实现 SurfaceHolder.Callback,而我的应用程序直接在 Activity 中实现了该接口。我不知道这是否是真正的问题,但是一旦我更改了代码来做到这一点,它似乎就起作用了。

因此,除非有人可以更好地向我解释,否则解决方法是不在您的活动中实现 SurfaceHolder.Callback。

于 2013-05-09T15:24:44.690 回答