モールス符号 (テキスト) の特定のテキストに基づいて、特定の長さ (out_tic) で LED をオンまたはオフにしようとしています。「postDelay」と sleep() または wait() を使用してこれを解決しようとしましたが、フラッシュの長さが常に同じであるか、アプリがクラッシュします.フラッシュが開始されていないときに開始するように指示されたためだと思いますまだ閉まっています。
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() メソッドは、パラメーターを設定し、プレビューを開始/停止するだけです。
ご協力いただきありがとうございます!
私のために働く新しいコード:
(ジェイレイモンドによる)
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();
}