Was kann dazu führen, dass sich eine Android-Aktivität bei der Rückkehr von der Kamera unendlich oft neu startet?

Ich habe einen seltsamen Fehler in meiner Anwendung, der dazu führt, dass eine Aktivität in einer Endlosschleife neu gestartet wird, wenn ich nach dem Aufnehmen eines Fotos von einer Kameraanwendung zurückkehre.

Der UI-Ablauf sieht folgendermaßen aus:

Haupttätigkeit ->Fotoaktivität akzeptieren -> in onCreate () Kamera mit startActivityForResult () öffnenKamerabildschirm -> Foto aufnehmen (oder abbrechen) -> zurück zu Foto annehmenDer Bildschirm "Foto akzeptieren" wird vollständig erstellt und sofort angehalten und in einer Endlosschleife neu erstellt

Der seltsame Teil ist, dass es nur für einige Kameras passiert. Auf meinem Nexus S mit Jellybean verhält sich die Standardkamera korrekt, während Camera Zoom FX diesen Fehler verursacht. Auf meinem Archos G9-Tablet mit ICS verursachen sowohl die Standardkamera als auch Zoom FX den Fehler.

Ich habe den Code Schritt für Schritt überprüft und kann die Quelle des Relaunch-Aufrufs nicht finden. Wenn ich den Debugger beim zweiten (und nachfolgenden) Aufruf von onCreate () stoppe, befindet sich im Aufrufstapel ein Aufruf von ActivityThread.handleRelaunchActivity (). Die Absicht hat nicht viele Informationen: Die Aktion ist null, die Klasse ist AcceptPhoto. Das mFlags hat den Wert 603979776, den ich nicht in die tatsächlichen Absichtsflags übersetzen kann.

Die Verrücktheit hört hier jedoch nicht auf. Wenn ich das erste Mal ein Bild auf meinem Tablet mache, ist die Anwendung in Ordnung. Wenn ich versuche, ein zweites Bild aufzunehmen, wird der Bildschirm verrückt. Wenn ich nicht das Sekundenbild mache, sondern zum vorherigen Bildschirm zurückkehre, ist alles in Ordnung, bis ich eine neue Aktivität öffne. Es spielt keine Rolle, von wo aus, wenn ich zur Stammaktivität zurückkehre und eine neue Aktivität beginne, flackert sie.

Ich werde versuchen, Code zu veröffentlichen, aber ich vermute, dass der Fehler nicht durch meinen Code verursacht wird, sondern dass ich etwas im zugrunde liegenden Android-Code auslöse. Was ich hoffe ist, dass vielleicht jemand mich in die richtige Richtung weisen kann, um einen Weg zu finden, um diesen Fehler zu umgehen. Alles kann hilfreich sein, also danke ich Ihnen für jede Idee!

Der Code zum Öffnen der Kamera (in AcceptPhoto.onCreate () mithilfe einer Dienstprogrammklasse aufgerufen):

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();
    }
}

Der Code zum Anzeigen des Bildes, der in AcceptPhoto.onActivityResult () aufgerufen wird:

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();
    }
}

In der Utility-Klasse verwendete Methode zum Erstellen / Abrufen der Datei, in der die Kamera das Foto speichert:

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;
}

Antworten auf die Frage(1)

Ihre Antwort auf die Frage