我在我的应用程序中使用相机服务。有时相机服务在应用程序中运行良好,有时会产生运行时异常。
我已将Camera.Open()放入try块中,我已捕获异常及其在log cat中的显示
03-12 13:52:42.211: D/crazy(12686): in catch1
03-12 13:52:42.211: D/crazy(12686): java.lang.RuntimeException: Fail to connect to camera service
我完成的代码是......
TelephonyManager mgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
int callState = mgr.getCallState();
//state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
if(callState==TelephonyManager.CALL_STATE_RINGING) {
try {
cam = Camera.open();
p = cam.getParameters();
String myString = "0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101011";
long blinkDelay = 50;
for (int i = 0; i < myString.length(); i++) {
//state=intent.getStringExtra(TelephonyManager.EXTRA_STATE);
callState = mgr.getCallState();
if (callState==TelephonyManager.CALL_STATE_IDLE){
p.setFlashMode(Parameters.FLASH_MODE_OFF);
cam.release();
break;
}else if (callState==TelephonyManager.CALL_STATE_OFFHOOK){
p.setFlashMode(Parameters.FLASH_MODE_OFF);
cam.release();
break;
}
if (myString.charAt(i) == '0') {
p.setFlashMode(Parameters.FLASH_MODE_TORCH);
cam.setParameters(p);
} else {
p.setFlashMode(Parameters.FLASH_MODE_OFF);
cam.setParameters(p);
}
Thread.sleep(blinkDelay);
}
}catch (Exception e) {
// TODO: handle exception
Log.d(tag, "in catch1");
Log.d(tag, e.toString());
}
答案 0 :(得分:0)
可能是因为它已经被使用了。
open状态的javadoc:
如果其他应用程序打开了同一个摄像头,则会抛出RuntimeException。
使用相机后必须调用release(),否则它将保持锁定状态并且对其他应用程序不可用。
您的应用程序一次只能为一个特定的硬件摄像头激活一个Camera对象。
确保始终释放相机(即使出现异常,请使用finally
)并检查是否没有其他应用程序使用它。
答案 1 :(得分:0)
这来自android docs here。只要你记得在完成后释放相机(至少在你尝试获得新实例之前),你应该没问题。我建议也阅读该文档的其余部分。这非常有帮助。
private boolean safeCameraOpen(int id){ boolean qOpened = false;
try {
releaseCameraAndPreview();
mCamera = Camera.open(id);
qOpened = (mCamera != null);
} catch (Exception e) {
Log.e(getString(R.string.app_name), "failed to open Camera");
e.printStackTrace();
}
return qOpened;
}
private void releaseCameraAndPreview() {
mPreview.setCamera(null);
if (mCamera != null) {
mCamera.release();
mCamera = null;
}
}