我已经在stackoverflow中查看了其他相机手电筒相关问题,但无法找到解决我问题的答案。手电筒闪烁6-8次,然后应用程序崩溃。这里我有一个blink()
方法,它在一个循环中调用cameraon()
和cameraoff()
。你能告诉我哪里做错了吗?我的代码可以在这里找到:http://pastebin.com/3LRMwd1Jlogcat输出如下所示:http://pastebin.com/2GTpn8Ux
我试过使用表面纹理,试图在cameraon()
和cameraoff()
之间包括Thread.sleep()
,但到目前为止没有运气。
我使用Android 4.4和最新的sdk和jdk版本。我使用nexus 5进行测试。
提前感谢!
只需在Blink()方法中使用Thread,并将您的代码放在if else
布尔tourchon = false;
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
if(tourchon){
cameraoff();
tourchon=false;
}else{
cameraon();
tourchon=true;
}
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
thread.start();
从您的cameraOn()
方法中分离相机对象的获取,因为我理解此方法应该打开闪光灯,在短时间内多次调用open()
可能会导致您的问题,如本文档所示。
注意:在某些设备上,此方法可能需要较长时间才能完成。最好从工作线程(可能使用AsyncTask)调用此方法,以避免阻塞主应用程序UI线程。
让你的on和off方法改变闪光模式,因为你已经有了相机实例
看看我的代码是否有帮助:https://github.com/wolfhorse/SimpleFlashlight
它不会闪烁,但它可能是一个很好的参考。
编辑:我通过添加下面的代码修改了上面引用的SimpleFlashlight应用程序中切换按钮的onClick()事件,它在我的三星Galaxy S5上闪烁/闪烁良好,没有错误。
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
boolean flashOn = false;
for (int i = 0; i < 20; i++) {
flashOn = !flashOn;
toggleFlash(flashOn);
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
thread.start();
像其他人建议的那样在新线程中包装-性能更好。