Активность убивается при выполнении намерения камеры - PullRequest
5 голосов
/ 16 марта 2012

[РЕДАКТИРОВАТЬ: Проблема решена.Пожалуйста, смотрите мой ответ ниже.]

В моем приложении я вызываю системную камеру, чтобы сделать снимок, а затем обрабатываю результат в onActivityResult.Вы знаете, обычный.Раньше это работало, но теперь моя деятельность по вызову убивается, пока я делаю снимок.В частности, onDestroy() вызывается в моей активности сразу после нажатия кнопки затвора камеры.Фотография действительно сделана и сохранена (я проверил, что файл записан на SD-карте).После того как я принимаю фотографию, вместо того, чтобы вернуться к вызывающему действию и вызвать onActivityResult, вызывается предыдущее действие в стеке действий.Я не вижу исключений в logcat.Мой обработчик пользовательских исключений не вызывается.Если это имеет значение, мое приложение также включает службу, которая прослушивает обновления GPS, но я отменяю регистрацию всех получателей в onPause().

Вот стек вызовов для MyCallingActivity.onDestroy():

Thread [<1> main] (Suspended (breakpoint at line 303 in NewPlaceDetailsActivity))   
    NewPlaceDetailsActivity.onDestroy() line: 303   
    ActivityThread.performDestroyActivity(IBinder, boolean, int, boolean) line: 2663    
    ActivityThread.handleDestroyActivity(IBinder, boolean, int, boolean) line: 2694 
    ActivityThread.access$2100(ActivityThread, IBinder, boolean, int, boolean) line: 117    
    BinderProxy(ActivityThread$H).handleMessage(Message) line: 968  
    ActivityThread$H(Handler).dispatchMessage(Message) line: 99 
    Looper.loop() line: 130 
    ActivityThread.main(String[]) line: 3687    
    Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]  
    Method.invoke(Object, Object...) line: 507  
    ZygoteInit$MethodAndArgsCaller.run() line: 842  
    ZygoteInit.main(String[]) line: 600 
    NativeStart.main(String[]) line: not available [native method]  

Вот как я запускаю работу камеры, если вам интересно:

protected void startCamera() {
    createPhotoDirsIfNeeded();

    String fileName = "temp.jpg";  
    ContentValues values = new ContentValues();  
    values.put(MediaStore.Images.Media.TITLE, fileName);  
    m_capturedImageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);  

    m_photoFileName = APP_PHOTO_PATH + "/" + DateFormat.format(DATE_FORMAT, Calendar.getInstance().getTime()) + ".jpg";
    File picFile = new File(m_photoFileName);
    if(picFile.exists()) {
        picFile.delete();
    }

    // start the camera activity
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT,  Uri.fromFile(picFile));
    startActivityForResult(intent, IntentHelper.REQUEST_TAKE_PHOTO);
}

Какя могу узнать, почему моя активность уничтожается и удаляется из стека, а не создается снова?

Ответы [ 3 ]

7 голосов
/ 20 марта 2012

ОК, я нашел проблему.Проблема была не столько в том, что деятельность была убита, а в том, что она не была восстановлена.Я понял, что это может произойти, когда ваша активность объявлена ​​в манифесте с android:noHistory="true".Таким образом, действие было удалено из стека после уничтожения, и вместо него было показано предыдущее действие.

После того, как я удалил параметр noHistory, действие снова стало появляться после использования камеры.

2 голосов
/ 19 марта 2012

Я думаю, проблема в том, что 1) в вашей пользовательской реализации обработчик исключений и 2) эта строка:

intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(picFile));
  1. Ваша реализация обработчика исключений не позволяет вам видеть NullPointerException, который выдается в методе onActivityResult, когда вы пытаетесь получить доступ к данным из возвращенного Intent.
  2. Кажется, что это ошибка, которая препятствует передаче Intent в метод onActivityResult, если выходной файл был добавлен в качестве дополнительного к Intent запускающей операции камеры.

Попробуйте удалить строку и посмотрите, будет ли ваша активность воссоздана после завершения действия камеры.

0 голосов
/ 21 марта 2012

Пожалуйста, выполните следующие действия:

1)  Add this in manifest :
    <uses-feature android:name="android.hardware.camera"></uses-feature>

2)  startCamera() :
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT,  Uri.fromFile(picFile));
    startActivityForResult(intent, IntentHelper.REQUEST_TAKE_PHOTO);


3)  if (requestCode == PICTURE_RESULT) //
             if (resultCode == Activity.RESULT_OK) {
                // Display image received on the view
                 Bundle b = data.getExtras(); // Kept as a Bundle to check for other  things in my actual code
                 Bitmap pic = (Bitmap) b.get("data");

                 if (pic != null) { // Display your image in an ImageView in your layout (if you want to test it)
                     pictureHolder = (ImageView) this.findViewById(R.id.IMAGE);
                     pictureHolder.setImageBitmap(pic);
                     pictureHolder.invalidate();
                 }
             }
             else if (resultCode == Activity.RESULT_CANCELED) {...}
    }

Если этот код все еще не работает для вас, перейдите по следующим ссылкам:

...