我正在尝试根据摩尔斯电码(文本)中的给定文本打开和关闭特定长度(out_tic)的 LED。我试图用“postDelay”和 sleep() 或 wait() 来解决这个问题,但是 flash 的长度总是相同或应用程序崩溃。我认为这是因为 Flash 被告知在它没有启动时启动关门了。
cam = Camera.open();
Handler handler = new Handler();
for(int i=0;i<Text.length();i++){
if(Text.charAt(i)=='.' ||Text.charAt(i)=='·'){
ledon();
handler.postDelayed(new Runnable() {
public void run() {
ledoff();
}
}, out_tic);
}
else if(Text.charAt(i)=='-'){
ledon();
handler.postDelayed(new Runnable() {
public void run() {
ledoff();
}
}, 3*out_tic);
}
else if(Text.charAt(i)=='/'){
if(Text.charAt(i-1)=='/'){
}
}
}
ledon() 和 ledoff() 方法只需设置参数并启动/停止预览。
谢谢你的帮助!
对我有用的新代码:
(由于 JRaymond)
final String Text = "./-..-/.-/--/.--./.-.././/";
final int out_tic = 200;
new Thread(new Runnable(){
@Override
public void run() {
for(int i=0;i<Text.length();i++){
if(Text.charAt(i)=='.' ||Text.charAt(i)=='·'){
flash(out_tic);
flashpause(out_tic);
continue;
}
else if(Text.charAt(i)=='-'){
flash(3*out_tic);
flashpause(out_tic);
continue;
}
else if(Text.charAt(i)=='/'){
flashpause(2*out_tic);
if(Text.charAt(i-1)=='/'){
flashpause(4*out_tic);
}
}
}
}
}).start();
}
private Handler handler = new Handler();
private void flash(final int sleeptime) {
handler.post(new Runnable() {
@Override
public void run() {
ledon();
}
});
try {
Thread.sleep(sleeptime);
} catch (InterruptedException e){
}
handler.post(new Runnable(){
public void run() {
ledoff();
}
});
}
private void flashpause(final int sleeptime) {
try {
Thread.sleep(sleeptime);
} catch (InterruptedException e){
}
}
private Camera cam;
private void ledon() {
cam = Camera.open();
Parameters params = cam.getParameters();
params.setFlashMode(Parameters.FLASH_MODE_TORCH);
cam.setParameters(params);
cam.startPreview();
}
private void ledoff() {
cam.stopPreview();
cam.release();
}