0

我從我需要修改的應用程序繼承了一些代碼(yuck)。所討論的活動實現了SurfaceHolder.Callback和SensorEventListener。此活動適用於自定義相機。爲什麼我的android活動停止?

該代碼可以很好地自動對焦並拍照。一旦拍攝照片,我開始另一個結果活動來裁剪圖像。一旦該活動開始,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] 

因爲這個攝像頭的活動不再有效,並且沒有收到來自作物活動的結果。

爲什麼銷燬表面/釋放相機會導致相機活動停止?我必須在這裏丟失一些東西......

+2

你能顯示你的相機活動代碼嗎? – Sameer 2013-05-08 14:11:40

+0

這是非常大,笨蛋(約900線)。因爲我沒有寫出來,所以我不確定是否可以出於合法原因把整個事情都放在那裏。但是,如果有些部分是有用的,我可以把它(SurfaceHolder.callback方法也許?)。 – Innova 2013-05-08 14:27:32

+0

在'onStop()'中放置一個斷點,找出調用它的地方。 – 323go 2013-05-08 14:48:55

回答

0

所以,我做了我在這樣的情況下,通常做的,並試圖簡化問題。我創建了一個全新的項目,遵循Android開發者網站上的指南:http://developer.android.com/guide/topics/media/camera.html#custom-camera

一旦我得到了我的新簡單應用程序拍攝照片,我修改了它來調用作物活動,並且它沒有問題。

示例應用程序之間最大的區別是它使用單獨的CameraPreview類來實現SurfaceHolder.Callback,其中我的應用程序直接在Activity中實現該接口。我不知道這是否是真正的問題,但是一旦我改變了代碼來做到這一點,它似乎就起作用了。

所以除非有人能更好地向我解釋,修復方法是不在你的活動中實現SurfaceHolder.Callback。

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

+0

我的請求代碼是0.我真的不認爲這是操作系統選擇結束我的活動,因爲資源或任何東西。因爲如果是這樣,在作物活動從堆棧中彈出之後,該活動是否應該重新創建?我認爲任務關聯可能是問題,因爲一些活動(而不是相機活動)具有singleTask的啓動模式。但是,我將所有singleTask更改爲標準,問題依然存在。 – Innova 2013-05-08 18:25:59

+0

嘗試請求代碼1. 另外,嘗試覆蓋finish()並查看是否從某個不期望的地方調用finish。 (拋出一個異常,抓住它並打印堆棧跟蹤或調試該方法以查看它從哪裏調用。 – 2013-05-15 00:25:47