2016-05-08 9 views
1

Lassen Sie mich damit beginnen zu sagen, dass, wenn Bild-Shooting-Intervall etwas mehr als 1 Sekunde ist es funktioniert. Zum Beispiel funktioniert ein Foto alle 2 Sekunden perfekt. Aber ein Foto jede Sekunde manchmal wirft java.lang.RuntimeException: takePicture failed. Was könnte diese Art von Verhalten verursachen? HierAndroid Kamera schlägt fehl, ein Bild jede Sekunde

ist der Code, den ich verwende, und es ist in Dienst:

@Override 
public void onCreate() 
{ 
    super.onCreate(); 
    prefs = getSharedPreferences("general",Context.MODE_PRIVATE); 
    handler = new Handler(); 

    shotInterval = prefs.getInt(getString(R.string.prefs_int_imageShootingFrequency),1); 

    if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) { 
     Toast.makeText(this, "No camera on this device", Toast.LENGTH_LONG).show(); 
    } else { 
     cameraId = findBackFacingCamera(); 
     if (cameraId < 0) { 
      Toast.makeText(this, "No front facing camera found.",Toast.LENGTH_LONG).show(); 
     } else { 
      camera = Camera.open(cameraId); 
     } 
    } 

    cameraParameters = camera.getParameters(); 
    cameraParameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); //set camera to continuously auto-focus 
    camera.setParameters(cameraParameters); 

    pictureTaker.run(); // Start looping 
} 

Runnable pictureTaker = new Runnable() { 
    @Override 
    public void run() { 
     try { 
      takePicture(); 
     } finally { 
      // 100% guarantee that this always happens, even if 
      // your update method throws an exception 
      handler.postDelayed(pictureTaker, shotInterval*1000); 
     } 
    } 
}; 

private void takePicture(){ 
    SurfaceView view = new SurfaceView(this); 
    try { 
     camera.setPreviewDisplay(view.getHolder()); 
     camera.startPreview(); 
     camera.takePicture(null, null,new PhotoHandler(getApplicationContext())); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
+0

Wenn ich raten müsste, würde ich sagen, dass die Kamera ist noch nicht bereit, das nächste Bild aufzunehmen, wenn Sie '' 'takePicture''' aufrufen. 1 Sekunde Intervall scheint mir ziemlich schnell. –

+0

Ich habe Programme gesehen (die Camera2-API nicht verwenden), die das erfolgreich machen. Was komisch ist, ist, dass es manchmal funktioniert und manchmal nicht. – Shard

+0

Diese Programme können jedoch unterschiedliche Hardware ausführen. Ihre Kamera ist möglicherweise langsamer. –

Antwort

1

Sie sollten postDelayed() vom onPictureTaken() Rückruf starten. Sie können den Systemtimer bei Anruf auf takePicture() überprüfen und die Verzögerung verringern, um 1000ms Wiederholung zu behalten, aber gelegentlich kann diese Verzögerung 0.

sein
+0

ist nicht 'onPictureTaken() 'Teil der Kamera2 API? – Shard

+0

Nein, bitte folgen Sie den [Link] (http://developer.android.com/reference/android/hardware/Camera.PictureCallback.html#onPictureTaken (Byte% 5B% 5D,% 20android.hardware.Camera)) –