2012-05-14 2 views
3

Probablement 90% du temps, les rappels échoueront à se déclencher. Et donc ma photo n'est jamais enregistrée.Android: Les rappels de Camera.takePicture ne se déclenchent pas toujours

Qu'est-ce que je fais mal?

@Override 
public boolean onTouchEvent(MotionEvent event) 
{ 
    boolean result = super.onTouchEvent(event); 

     int action = event.getAction(); 
     if(action == MotionEvent.ACTION_DOWN) 
     { 
      takePicture(); 

      this.finish(); // ERROR IS HERE. Closing down before callback is done. 

     }  
     return result; 
} 

private void takePicture() { 
    if (mCamera != null) 
     mCamera.takePicture(shutterCallback, null, jpegCallback);  
} 

ShutterCallback shutterCallback = new ShutterCallback() { 
     public void onShutter() { 

      AudioManager meng = (AudioManager) getBaseContext().getSystemService(Context.AUDIO_SERVICE); 
      int volume = meng.getStreamVolume(AudioManager.STREAM_NOTIFICATION); 

      if (volume != 0) 
      { 
        MediaPlayer _shootMP = MediaPlayer.create(getBaseContext(), Uri.parse("file:///system/media/audio/ui/camera_click.ogg")); 
        _shootMP.start(); 
      } 
     Toast.makeText(CameraActivity.this, "Picture Taken", Toast.LENGTH_SHORT).show(); 
     } 
}; 

PictureCallback rawCallback = new PictureCallback() { 
     public void onPictureTaken(byte[] _data, Camera _camera) { 
     // TODO Do something with the image RAW data. 
      int test = 1; 
     } 
}; 

PictureCallback jpegCallback = new PictureCallback() { 
    public void onPictureTaken(byte[] _data, Camera _camera) { 
     File photo=new File(Environment.getExternalStorageDirectory(), "photo1.jpg"); 

     if (photo.exists()) { 
      photo.delete(); 
     } 

     try { 
     FileOutputStream fos=new FileOutputStream(photo.getPath()); 

     fos.write(_data); 
     fos.close(); 
     } 
     catch (java.io.IOException e) { 
     Log.e("PictureDemo", "Exception in photoCallback", e); 
     } 



     SqlDB.SavePhoto(1, _data);  
    } 
}; 

Répondre

2

Pouvez-vous déboguer et vérifier est-il dans l'une des fonctions rawCallback ou jpegCallback. Vous définissez le format jpeg pour votre appareil photo ou non. Je pense que selon cette fonction de rappel sera appelé. Donc, il devrait soit aller dans rawCallback ou jpegCallback. Pouvez-vous essayer une fois.

mCamera.takePicture (shutterCallback, rawCallback, jpegCallback);

En cas d'échec, l'endroit où il se trouve peut être quelque part où vous ouvrez à nouveau votre caméra. Dans ce cas, je pense que votre paramètre de caméra sera réinitialisé et peut retourner le callback brut au lieu de jpeg

En fait, je pense que si la caméra ne plante pas et qu'elle n'est pas nulle, le seul cas restant est que vous réinitialisez votre caméra par défaut paramètres ou vous ouvrez votre appareil photo à nouveau ..

+0

J'avais à l'origine fait le suggéré. Je viens de définir raw à null car il n'est pas désiré et serait un rappel supplémentaire. Sa définition des callbacks aka mCamera n'est pas nulle, mais elle déclenche rarement les callbacks. – Doomsknight

+0

C'est ce que je veux que vous vérifiiez une fois s'il échoue alors où il va peut être quelque part que vous ouvrez votre caméra à nouveau. Dans ce cas, je pense que votre paramètre de caméra sera réinitialisé et peut renvoyer un rappel brut au lieu de jpeg. –

+0

Une fois l'image prise, elle ferme l'activité. La seule façon de reprendre la photo est de recharger l'activité, donc de l'initialiser à nouveau. A moins de fermer l'activité (et de jeter la caméra) avant que le rappel ne soit fait? – Doomsknight

Questions connexes