我从我需要修改的应用程序(yuck)继承了一些代码。有问题的活动实现了SurfaceHolder.Callback和SensorEventListener。此活动适用于自定义相机。
该代码可以自动对焦并拍照。拍摄照片后,我会开始另一项活动,以便裁剪图像。一旦该活动开始,就会调用SurfaceDestroy的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]
因此,相机活动不再有效,并且不会从作物活动中收到结果。
为什么破坏表面/释放相机会导致相机活动停止?我必须在这里遗漏一些东西......
答案 0 :(得分: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
答案 1 :(得分:0)
所以,我在这种情况下做了我通常做的事情,并试图简化问题。我按照Android开发者网站上的指南创建了一个全新的项目:http://developer.android.com/guide/topics/media/camera.html#custom-camera
一旦我得到了一个新的简单应用程序来拍照,我修改了它来调用裁剪活动,它没有问题。
示例应用程序之间最大的不同之处在于它使用单独的CameraPreview类来实现SurfaceHolder.Callback,而我的应用程序直接在Activity中实现了该接口。我不知道这是不是真正的问题,但是一旦我改变代码来做到这一点,它似乎有效。
因此,除非有人能够更好地向我解释,否则解决方法是在您的活动中不实施SurfaceHolder.Callback。