private void takeSnapShots() {
Log.e(TAG, "takeSnapShots: " + "Start");
// here below "this" is activity context.
SurfaceView surface = new SurfaceView(this);
Camera camera = Camera.open();
try {
camera.setPreviewDisplay(surface.getHolder());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
camera.startPreview();
camera.takePicture(null,null,jpegCallback);
}
/** picture call back */
android.hardware.Camera.PictureCallback jpegCallback = new android.hardware.Camera.PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera)
{
FileOutputStream outStream = null;
try {
String dir_path = "/storage/C897-99BC/Android/data/com.dbsource.dbinsert/NewFolder/";
Date currentTime = Calendar.getInstance().getTime();
outStream = new FileOutputStream(dir_path+ File.separator+currentTime.getTime()+".jpg");
outStream.write(data);
outStream.close();
Log.d("CAM", "onPictureTaken - wrote bytes: " + data.length);
} catch (FileNotFoundException e) {
Log.e(TAG, "onPictureTaken: " + e.toString());
e.printStackTrace();
} catch (IOException e) {
Log.e(TAG, "onPictureTaken: " + e.toString());
e.printStackTrace();
} finally {
camera.stopPreview();
camera.release();
camera = null;
Log.e(TAG, "takeSnapShots: " + "End");
}
Log.d("CAM" ,"onPictureTaken - jpeg");
}
};`
我使用上面的代码和TimerTask来每2秒触发一次函数。起初效果很好。但是,在拍摄了几张照片之后,TimerTask继续工作,但是没有拍照。
错误代码:
/ com.dbsource.dbinsert E / Camera_APM :: [APM] APM的线程已启动/com.dbsource.dbinsert E / Camera_APM ::: [APM]此应用是地面应用/? E / CameraService:访问被拒绝:不能通过空闲的UID使用摄像机pid = 5436,uid = 10275/com.dbsource.dbinsert E / CAM:java.lang.RuntimeException:无法连接到摄像头服务
更新:
在camera.release()之后,在我调用该函数之前,发生了相机“错误3”。
由于以下限制,我在评论栏中输入了我的评论:“您必须拥有50个声誉才能发表评论”。
无论如何,回到您的问题。 IMO,对于摄像机的重复操作,“ 2秒”太快了。当然,它可能会工作几次,但最终会崩溃。可能会发生很多RuntimeExceptions
,可能与相机,存储写入等有关。如果可能,请延长时间。如果没有,您可能必须在网络上搜索其他替代实现。