2017-09-28 4 views
1

Je suis en train de construire une application qui utilise l'API de l'appareil photo pour prendre une photo chaque seconde pendant 10 secondes. J'ai suivi le tutoriel dans ce lien Android Camera API et j'ai modifié le code pour obtenir ma liste d'images (voir le code ci-dessous). Tout a parfaitement fonctionné ...Android caméra désactiver stopPreview sur takePicture

Maintenant, le problème est (je suppose) sur la méthode takePicture car elle arrête l'aperçu, je dois commencer à nouveau dans le rappel onPictureTaken qui provoque un petit moment de écran geler.

private void initializeCamera() { 
    // Create an instance of Camera 
    mCamera = getCameraInstance(); 

    // Create our Preview view and set it as the content of our activity. 
    CameraPreview mPreview = new CameraPreview(this, mCamera); 
    FrameLayout preview = findViewById(R.id.camera_preview); 
    preview.addView(mPreview); 
    mCamera.setPreviewCallback(new Camera.PreviewCallback() { 
     @Override 
     public void onPreviewFrame(byte[] bytes, Camera camera) { 
      startRecognition(); 
     } 
    }); 
} 


private PictureCallback mPicture = new PictureCallback() { 
    @Override 
    public void onPictureTaken(byte[] data, Camera camera) { 
     mCamera.startPreview(); // <----- Restart preview.. stop freeze 
     // Task to detect an object in the picture.. Do something 
    } 
}; 


public void startRecognition() { 
    if (SystemClock.elapsedRealtime() - startedTime > 10000) { 
     // Detection has failed.. Do something 
    } 
    else { 
     // Get a frame each second 
     if (SystemClock.elapsedRealtime() - elapsedTime > 1000) { 
      elapsedTime = SystemClock.elapsedRealtime(); 
      mCamera.takePicture(null, null, mPicture); // <---- Take picture but stop preview 
     } 
    } 
} 

De doc Camera Android:

8) Après avoir pris une photo, écran de prévisualisation ont arrêté. Pour prendre d'autres photos, appelez d'abord startPreview().

est-il un moyen de désactiver le stopPreview, ou toute autre chose que cette méthode ne, quand je prends la photo?

Nous vous remercions de votre aide.

+0

essayez https://developer.android.com/reference/android/hardware/Camera.html#release() et vous pouvez voir: https://stackoverflow.com/questions/6200369/picturecallback-onpicturetaken-never- appelé –

+0

Ne fonctionne pas ... – fattidare

Répondre

1

Peut-être que pour vous, la résolution obtenue en onPreviewFrame() peut-être suffisante? Ensuite, il n'est pas nécessaire de redémarrer la caméra après 'prendre une photo'. L'aperçu en direct ne gèlera pas.

Si vous ciblez des API avec> = 21 (Lollipop), vous devez utiliser la nouvelle API camera2 au lieu de l'API dépréciéeCamera. La nouvelle API comporte de nombreuses améliorations, et parmi celles-ci, elle peut faciliter la capture multi-images.

Même si vous êtes coincé avec l'ancienne API, il y a quelques améliorations à apporter. L'un des problèmes avec votre code existant est qu'il fonctionne avec l'appareil photo sur le thread UI. Plutôt, use a background HandlerThread pour ouvrir la caméra, et assurez-vous également que onPictureTaken() redémarre prévisualisation et retourne immédiatement, en déchargeant tout le traitement à un autre thread de travail.

+1

J'ai choisi de capturer l'image directement dans l'onPreviewFrame(). Cela fonctionne bien avec un traitement sur les données d'entrée – fattidare