我想在来电时闪烁手电筒。每次这个代码进入服务方法,即它运行良好,它启动服务很好,但问题是它无法每次启动摄像头服务。如果摄像头正在运行,则呼叫状态发生变化时,闪烁不会停止。如果呼叫状态发生变化,我怎么能每次启动摄像头并停止闪烁? 我用的代码......
清单中的
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.FLASHLIGHT"/>
在服务中
String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
if(state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
try {
cam = Camera.open();
p = cam.getParameters();
String myString = "0101010101010101010101010101010101010101010101011";
long blinkDelay = 150;
cam.setParameters(p);
for (int i = 0; i < myString.length(); i++) {
if (state.equals(TelephonyManager.EXTRA_STATE_IDLE)){
break;
}else if (state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){
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);
}
try {
Thread.sleep(blinkDelay);
} catch (Exception e) {
Log.d(tag, e.toString());
p.setFlashMode(Parameters.FLASH_MODE_OFF);
cam.setParameters(p);
}
}
}catch (Exception e) {
// TODO: handle exception
Log.d(tag, "in catch1");
Log.d(tag, e.toString());
}
}else if (state.equals(TelephonyManager.EXTRA_STATE_IDLE)){
cam.release();
stopSelf();
}else if (state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){
cam.release();
stopSelf();
}
}
logcat没有停止,它仍然在运行,疯狂的是我声明我得到的标签
03-11 23:11:08.129: W/CameraService(133): CameraService::connect X (pid 942) rejected (existing client).
03-11 23:11:08.139: D/crazy(942): in catch1
03-11 23:11:08.139: D/crazy(942): java.lang.RuntimeException: Fail to connect to camera service
答案 0 :(得分:0)
如果您查看Camera documentation,打开相机可能会抛出RuntimeException
的一个原因是另一个进程正在使用相机,这是错误日志似乎表明的内容。检查正在运行的其他进程,并确保没有其他进程正在使用相机(您还应该正确处理此错误)。
您还应确保您的应用程序正在相机上调用release()
,这样您就不会阻止其他应用程序使用它。