Намерение камеры уничтожает активность

Я публикую этот вопрос после нескольких дней борьбы с этой проблемой. У меня есть плавающая кнопка действия, и прослушиватель onClick вызывает метод takePhoto(), где я, очевидно, хочу сделать снимок и сохранить его растровое изображение, которое я буду использовать позже, чтобы сохранить его в базе данных. Но это не главная проблема. Я запускаю onActivityResult (...), чтобы получить данные о сделанной фотографии. Когда я делаю снимок и нажимаю «Сохранить», действие просто уничтожается (я использовал Log.v (...), чтобы проверить, действительно ли оно уничтожено). Я пробовал почти все, включая переопределение onSaveInstanceState (...) и так далее. Вот мой файл манифеста Android и часть этого кода.

Манифест:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.alexparunov.collegemascots" >

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".account.SignIn"
              android:label="@string/title_activity_login">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".account.SignUp"
              android:label="@string/title_activity_register"/>
    <activity
        android:name=".profile.MainProfile"
        android:configChanges="orientation|keyboardHidden|screenSize"
        android:screenOrientation="portrait"
        android:noHistory="true"/>
</application>

Java: private static final int REQUEST_IMAGE_CAPTURE = 1;

private void takePhoto(){
    if(ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED){
        ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CAMERA},1);
    }
    Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if(cameraIntent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(cameraIntent, REQUEST_IMAGE_CAPTURE);
    }
    Image finalImage = new Image();
    if(user != null && imageBitmap != null) {
        finalImage.setImageOwner(user.getUsername());
        finalImage.setImageName(generateName());
        finalImage.setImage(ImageUtils.getBytesFromBitmap(imageBitmap));

        try {
            ImageDatabase imageDatabase = new ImageDatabase(this);
            imageDatabase.open();
            finalImage.setImageId(imageDatabase.createImage(finalImage));
            Log.v("TakeImage",""+finalImage.getImageId());
            imageDatabase.close();
            images.add(finalImage);
            user.setImages(images);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if(requestCode == REQUEST_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK) {
        Bundle extras = data.getExtras();
        imageBitmap = (Bitmap) extras.get("data");
    }
}

private String generateName(){
    String name = user.getName()+"_";
    if(images != null) {
        name += images.size() + ".png";
    }
    return name;
}

person Alexander Parunov    schedule 20.03.2016    source источник
comment
Ваш процесс может быть остановлен, пока он находится в фоновом режиме, особенно если на переднем плане находится приложение, требующее много памяти, например приложение камеры. В чем точно ваша проблема?   -  person CommonsWare    schedule 20.03.2016
comment
На этот вопрос есть принятый ответ: stackoverflow.com/questions/ 10319330/ A (Ваша активность) будет воссоздана в следующий раз, когда пользователь посетит ее или понадобится, и в этот момент будут доставлены все ожидающие результаты. Второй ответ на этот вопрос говорит о сохранении пути к фотографии: stackoverflow.com/questions /16014930/ и причины уничтожения активности.   -  person Matthew Carlson    schedule 20.03.2016
comment
Итак, вы хотите сказать, что когда я вызову activityForResult, она будет вызываться для сохранения данных, и когда я снова начну активность, результат будет готов? Если так и должно быть, то у меня это не работает, так как я проверил, а моя база данных пуста :( Я сделал фото и после уничтожения снова начал активность, но ничего не произошло.   -  person Alexander Parunov    schedule 20.03.2016
comment
Я нашел ответ на аналогичный вопрос ЗДЕСЬ   -  person Gogi Bobina    schedule 18.04.2016


Ответы (2)


Я думаю, что это android:noHistory="true"... Похоже, после фотографирования он возвращается к предыдущему действию в стеке истории, но там нет активности, так как он настроен на отсутствие истории.

person Lovenkrands    schedule 11.07.2016

Убедитесь, что ориентация не является проблемой здесь, на некоторых устройствах камера по умолчанию является альбомной после того, как onActivityResult вызывает вашу активность, может перезапуститься.

person Omar Mahmoud    schedule 20.03.2016