Co może spowodować, że aktywność w Androidzie wznowi się bez końca podczas powrotu z kamery?

Mam dziwną usterkę w mojej aplikacji, która powoduje ponowne uruchomienie aktywności w nieskończonej pętli, gdy wracam z aplikacji aparatu, po zrobieniu zdjęcia.

Przepływ interfejsu użytkownika wygląda następująco:

Główna działalność ->Akceptuj aktywność Photo -> w onCreate () otwórz kamerę za pomocą startActivityForResult ()Ekran aparatu -> zrób zdjęcie (lub anuluj) -> wróć do Akceptuj zdjęcieEkran Akceptuj zdjęcie jest tworzony całkowicie i natychmiast zatrzymywany i odtwarzany w nieskończonej pętli

Dziwne jest to, że dzieje się tak tylko w przypadku niektórych kamer. Na moim Nexusie S działającym w Jellybean kamera zapasowa zachowuje się prawidłowo, podczas gdy kamera Zoom FX powoduje ten błąd. Na moim tablecie Archos G9 z systemem ICS zarówno kamera zapasowa, jak i funkcja Zoom FX powodują błąd.

Sprawdziłem kod krok po kroku i nie mogę znaleźć źródła wywołania ponownego uruchomienia. Kiedy zatrzymuję debuger w drugim (i kolejnym) wywołaniu onCreate (), w stosie wywołań występuje wywołanie ActivityThread.handleRelaunchActivity (). It's Intent nie ma wiele informacji: akcja ma wartość null, klasa to AcceptPhoto. MFlags ma wartość 603979776, której nie wiem, jak przetłumaczyć na rzeczywiste flagi zamiarów.

Jednak ta dziwność nie kończy się tutaj. Na moim tablecie po raz pierwszy robię zdjęcie, aplikacja jest w porządku. Jeśli spróbuję zrobić drugie zdjęcie, ekran zwariuje. Jeśli zamiast robienia zdjęć sekundowych wracam do poprzedniego ekranu, wszystko jest w porządku, dopóki nie otworzę nowej aktywności. Nie ma znaczenia skąd, jeśli wrócę do aktywności roota i rozpocznę nową aktywność, zacznie migotać.

Spróbuję opublikować jakiś kod, ale podejrzewam, że błąd nie jest spowodowany przez mój kod, ale uruchamiam coś w podstawowym kodzie Androida. Mam nadzieję, że ktoś może wskazać mi właściwy kierunek, aby znaleźć sposób na obejście tego błędu. Wszystko może być pomocne, więc dziękuję za pomysł!

Kod używany do otwarcia kamery (wywołany w AcceptPhoto.onCreate (), przy użyciu klasy narzędziowej):

private void openCamera(Context context) {
    Intent pictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    File tempFile = getTempFile(context);
    try {
        if (tempFile != null) {

            pictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(tempFile));

            ((Activity) context).startActivityForResult(pictureIntent, GET_ITEM_PHOTO);
        } else {
            Toast.makeText(context, "Could not create temp file", Toast.LENGTH_SHORT).show();
        }
    } catch (Exception e) {
        Toast.makeText(context, "Error opening camera " + e.getMessage(), Toast.LENGTH_LONG).show();
        e.printStackTrace();
    }
}

Kod używany do wyświetlania obrazu, wywołany w AcceptPhoto.onActivityResult ():

private void displayPhoto() {
    if (cameraUtils == null) {
        cameraUtils = new CameraUtil();
    }
    previewImageView.setImageDrawable(null);
    File tempFile = cameraUtils.getTempFile(this);

    int rotation = 0;
    try {
        ExifInterface exif = new ExifInterface(tempFile.getPath());
        String orientation = exif.getAttribute(ExifInterface.TAG_ORIENTATION);
        Log.i("SPRING", "Photo orientation " + orientation);
        rotation = getBitmapRotation(Integer.valueOf(orientation));
        Log.i("SPRING", "The image needs to be rotated by " + (rotation) + " degrees");
    } catch (IOException e1) {
        e1.printStackTrace();
    }
    try {
        previewBitmap = BitmapEncoderUtil.loadPrescaledBitmap(tempFile);
        if (rotation != 0) {

            Matrix rotationMatrix = new Matrix();
            rotationMatrix.postRotate(rotation);

            int w = previewBitmap.getWidth();
            int h = previewBitmap.getHeight();

            Bitmap rotatedBitmap = Bitmap.createBitmap(previewBitmap, 0, 0, w, h, rotationMatrix, false);

            previewBitmap = rotatedBitmap;
        }
        previewImageView.setImageBitmap(previewBitmap);
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

Metoda użyta w klasie narzędzi do utworzenia / pobrania pliku, w którym kamera zapisuje zdjęcie:

public File getTempFile(Context context) {

    String externalStorageStateString = Environment.getExternalStorageState();
    File cacheDirectory;
    // try to save in external storage
    if (externalStorageStateString.equals(Environment.MEDIA_MOUNTED)) {
        cacheDirectory = context.getExternalCacheDir();
    } else {
        // save in internal storage
        cacheDirectory = context.getCacheDir();
    }
    File tempSnapshotFile = new File(cacheDirectory, MissionOtherActivity.ITEM_SNAPSHOT_PATH);

    // make sure the file exists, possible fix for the camera bug
    try {
        if (tempSnapshotFile.exists() == false) {
            tempSnapshotFile.getParentFile().mkdirs();
            tempSnapshotFile.createNewFile();
        }

    } catch (IOException e) {
        Log.e("SPRING", "Could not create file.", e);
    }
    return tempSnapshotFile;
}

questionAnswers(1)

yourAnswerToTheQuestion