6
votes

Superficiel avec aperçu de la caméra n'est pas détruit

J'ai une activité d'onglet avec 2 onglets (activités). Chaque onglet comporte une scène GL 3D ouverte dessinée sur une vue superficielle avec aperçu de la caméra.

Cependant, en fonction de l'orientation du périphérique, des onglets sont en cours de commutation.

Le problème est que lorsque l'autre activité commence, il appelle la caméra.Open (), qui génère une exception, affirmant que le service de caméra est indisponible.

En fait, le problème est que la caméra n'est pas arrêtée lorsque l'activité est en pause, en d'autres termes OnsurfaCeDestroyed () n'est pas appelée à la vue View. J'ai essayé d'arrêter la caméra lorsque l'onpause () pour les activités est appelée, mais obtenez la même erreur toujours.

Quiconque avait les mêmes problèmes avec des activités à onglets? N'importe quelle idée comment faire la part d'une vue de surface?


1 commentaires

Avez-vous appelé les deux .stoppreview () et .Release () sur votre objet de caméra?


3 Réponses :


3
votes
private SurfaceHolder.Callback mSurfaceHolderListener = new SurfaceHolder.Callback() {

    public void surfaceDestroyed(SurfaceHolder holder) {
        Log.e("TABACT", "surfaceDestroyed()");
        camera.stopPreview();
        camera.setPreviewCallback(null); 
        camera.release();
        camera = null;
    }

2 commentaires

Trouvé la solution. Tout d'abord pour chaque activité d'onglets Créez un Framelayout qui contient toutes les vues de l'enfant. Définissez-le comme vue de contenu. Pourtant, arrêtez la caméra en appelant simplement à Onpaause () SETSPIBILIBILITY À VIEW.GONE ET VIEW.Visible à Onresume ().


Merci beaucoup pour cela. J'ai eu le problème que sur le Sony Ericsson Xperia mini le menu Activer / Désactiver USB à partir de la barre de notification déroulante a fait une pause de mon appareil photo mais n'a pas détruit la surface. Étonnamment, seul le menu Activer / Désactiverait ce problème, le menu Paramètres de débogage USB s'est comporté correctement. Utilisation de SETVIPIBILITÉ () Comme vous l'avez décrit directement pour la vue View pour l'aperçu de la caméra a résolu complètement le problème.



7
votes

On dirait que cette question est assez populaire, alors j'ajoute la solution ici une fois de plus.

La cause fondamentale était que la surface surfacédoyée n'a jamais été appelée à la superficieviette lorsque l'application était en pause.

J'ai donc créé un Framelayout qui contient toutes les vues de l'enfant. Définissez-le comme vue de contenu. Pourtant, arrêtez la caméra en appelant simplement SETVisivibility (View.Gone) dans Onpaause () et View.Visible à Onresume (). Cela conduira à la destruction de la supervision.


0 commentaires

0
votes

C'est bon pour moi:

 public void surfaceDestroyed(SurfaceHolder holder) {
        Log.e("TABACT", "surfaceDestroyed()");
        camera.stopPreview();
        camera.setPreviewCallback(null); 
        camera.release();
        camera = null;
    }


0 commentaires