0

Я унаследовал некоторый код из приложения, которое мне нужно изменить (yuck). Эта деятельность реализует SurfaceHolder.Callback и SensorEventListener. Эта деятельность предназначена для пользовательской камеры.Почему моя активность андроида остановлена?

Код отлично подходит для автофокусировки и сфотографирован. После того, как снимок сделан, я запускаю другое действие для результата, чтобы обрезать изображение. Как только эта активность будет запущена, вызывается SurfaceHolder.Callback для surfaceDestroyed (как и ожидалось). На этом этапе существующее приложение освобождает камеру (как и ожидалось). Однако при запуске новой активности урожая исходная активность камеры прекращается (трассировка стека: Instrumentation.callActivityOnStop-> Activity.performStop). не

Edit: Полные трассировки стеки, когда 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

+0

Очень большой и неуклюжий (около 900 строк).И так как я этого не писал, я не уверен, могу ли я просто поместить все это по юридическим причинам. Однако, если есть части, которые были бы полезны, я могу положить это (возможно, методы SurfaceHolder.callback?). – Innova

+0

Поместите контрольную точку в 'onStop()' и узнайте, что ее вызывает. – 323go

ответ

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

+0

Попробуйте код запроса 1. Кроме того, попробуйте переопределить finish() и посмотрите, хотите ли вы закончить то, от чего вы не ожидаете. (Выбросьте исключение, поймайте его и распечатайте трассировку стека или отлаживайте этот метод, чтобы увидеть, откуда он вызван. –