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);
}
};
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
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. –
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