web-dev-qa-db-fra.com

Android: activité détruite après avoir appelé Camera Intent

J'ai deux activités (A1, A2). A1 appelle A2 et de A2 j'appelle l'intention de la caméra comme ci-dessous

launchIntent = new Intent(Android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
launchIntent.putExtra(MediaStore.EXTRA_OUTPUT,photoPath);   
startActivityForResult(launchIntent,CAMERA_REQUEST);

Il ouvre l'appareil photo et je peux prendre la photo. Mais le problème survient une fois que je clique sur le bouton Enregistrer (cochez le bouton en s3), mon onActivityResult n'est pas appelé à la place, la méthode onDestroy d'A2 est appelée. J'ai quelques logiques à faire dans le fn onActivityResult.

J'avais lu un article dans Stackoverflow à ce sujet mais je ne pouvais pas obtenir de sortie utile à partir de cela. J'ai mon manifeste comme celui-ci pour ma deuxième activité (A2)

Android:configChanges="keyboardHidden|orientation|locale"
Android:screenOrientation="portrait

Remarque: Dans HTC One X, mon onActivityResult fn est appelé, mais dans mon S3, la deuxième activité (A2) est détruite

Veuillez partager vos réflexions à ce sujet. Merci d'avance

37
Sudarshan

j'ai eu le même problème. je serai fou mais finalement j'ai trouvé une solution ici . le problème est que lorsque vous cliquez sur le bouton "enregistrer" de la caméra, la méthode d'orientation du changement d'appel d'activité est détruite et recréée. essayez de régler

Android:configChanges="orientation|screenSize"

dans Android manifest (non seulement Android:configChanges="orientation" car comme le suggère ici , cela ne fonctionne pas pour l'API niveau 13 ou supérieur).

ça empêche de détruire l'activité, ça marche pour moi.

80
giacomo87

Le lancement de la caméra nécessite beaucoup de mémoire. Ainsi, sur les appareils à faible mémoire Android ferme les activités en arrière-plan et donc onCreate () est appelé. En raison de ce photopathe que vous avez donné, il devient nul et vous ne pourrez pas obtenir l'image enregistrée .

La solution consiste à sauver le photopathe pendant que le système détruit votre activité, puis à la restaurer à nouveau.

@Override
    public void onSaveInstanceState(Bundle outState) {
        // TODO Auto-generated method stub

            outState.putString("photopath", photopath);


        super.onSaveInstanceState(outState);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        if (savedInstanceState != null) {
            if (savedInstanceState.containsKey("photopath")) {
                photopath = savedInstanceState.getString("photopath");
            }
        }

        super.onRestoreInstanceState(savedInstanceState);
    }

et au cas où vous le feriez sur Fragment.

@Override
    public void onSaveInstanceState(Bundle outState) {
        // TODO Auto-generated method stub

            outState.putString("photopath", photopath));


        super.onSaveInstanceState(outState);
    }

    @Override
    public void onViewStateRestored(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        if (savedInstanceState != null) {
            if (savedInstanceState.containsKey("photopath")) {
                photopath = savedInstanceState.getString("photopath");
            }
        }

        super.onViewStateRestored(savedInstanceState);
    }
36
Rajesh Narwal

Assurez-vous que le paramètre développeur "Ne pas garder les activités" n'est pas activé, car cela détruira l'activité que vous quittez.

23
Omaraf

Mon activité comporte de nombreuses tâches en cours lorsque j'appelle Camera Intent. J'ai des écouteurs de localisation GPS et bien d'autres tâches.

Quand il revient de l'objectif de la caméra, j'ai besoin d'ajouter un marqueur sur une carte à l'endroit où l'image a été prise .. Donc, si l'utilisateur a pris plus d'une photo, il devrait montrer des marqueurs pour chaque photo ..

Si cela détruit mon activité à chaque fois que j'appelle Camera Intent, toutes les informations que j'avais auparavant sur les marqueurs et leur emplacement seront perdues. Et aussi, je devrai réinitialiser la carte. C'est un gros problème pour mon application.

Et oui, cela ne se produit que lorsque je prends une photo en mode paysage. Si je prends la photo en portrait, tout va bien jusqu'à présent ..

Je vais essayer d'utiliser Android:configChanges="orientation|screenSize" Comme suggéré ici .. J'espère que cela vous aidera!

1
Moti Bartov

Pour moi, cela se produit lorsque j'active une option en mode développeur appelée "Ne pas garder les activités". Après l'avoir décochée, l'activité ne sera pas recréée lors du choix d'une image dans la galerie ou dans l'application appareil photo.

1
Shihab Uddin