我现在已经在摩尔斯电码应用程序上工作了一段时间,我无法将相机闪光灯照相,嗯......闪光灯。我的最终目标是键入一条简短的消息,按一个按钮,然后让LED在摩尔斯电码中闪烁消息,方法是将用户输入的消息作为CharArray或其他内容循环。用户还应该能够在闪烁/翻译期间随时取消该过程。使用此代码,我可以通过触摸切换按钮轻松打开和关闭灯光。
mToggleButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
if (checked) {
camera = Camera.open();
Camera.Parameters parameters = camera.getParameters();
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
camera.setParameters(parameters);
camera.startPreview();
} else {
Camera.Parameters parameters = camera.getParameters();
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
camera.setParameters(parameters);
camera.stopPreview();
camera.release();
}
}
});
我已经让LED开启,等待给定的延迟时间,然后使用Handler和postDelayed()通过单个按钮按下此代码关闭。
Camera camera;
public void flash(int delay) {
camera = Camera.open();
final Camera.Parameters parameters = camera.getParameters();
Handler handler = new Handler();
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
camera.setParameters(parameters);
camera.startPreview();
handler.postDelayed(new Runnable() {
public void run() {
Camera.Parameters parameters = camera.getParameters();
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
camera.setParameters(parameters);
camera.stopPreview();
camera.release();
}
}, delay);
}
但如果我尝试在同一个按钮上多次运行上述闪光灯功能,请在Camera.open()中收到以下错误:第二个函数调用开始时的行。
java.lang.RuntimeException:无法连接到相机服务
我已经做了很多关于如何实现多次闪光目标的研究,最好/唯一可行的解决方案是使用Thread.sleep()。我的理解是,这将睡眠整个UI线程(因为这是我使用的唯一线程),这是一个不好的做法。我的问题还有其他解决方案吗?我简短地看了很多线程,但很快就变得不知所措,并且不确定这是我希望的答案的圣杯。
提前感谢任何建议!
答案 0 :(得分:-1)
我想到了两件事。
检查特定于cameraFlashlight的权限
<permission android:name="android.permission.FLASHLIGHT"
android:permissionGroup="android.permission-group.HARDWARE_CONTROLS"
android:protectionLevel="normal"/>
<uses-feature android:name="android.hardware.camera" />
尝试使用android.hardware.camera2 API,因为从Android API级别21弃用了Camera API。