Android 莫尔斯密码发声器2:使用ToneGenerato
2018-12-19 本文已影响27人
silencefun
发出滴滴答答的声音,参考了一些其他的作品,最后选择使用ToneGenerator发声。通过控制时长来发出滴答对应的长度的声响。
创建发音的类 其中 两个数组来存放 字母的 长码 短码的 电码。
private static final String KEYS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ!";
private static final String[] CODES_LONG = new String[]{
// numbers 0 .. 9
"-----", ".----", "..---", "...--", "....-",
".....", "-....", "--...", "---..", "----.",
// characters A .. Z
".-", "-...", "-.-.", "-..", ".", "..-.", "--.",
"....", "..", ".---", "-.-", ".-..", "--", "-.",
"---", ".--.", "--.-", ".-.", "...", "-", "..-",
"...-", ".--", "-..-", "-.--", "--..",
// special characters
"...-."
};
private static final String[] CODES = new String[]{
// numbers 0 .. 9
"-", ".-", "..-", "...--", "....-",
".", "-.", "--...", "-..", "-.",
// characters A .. Z
".-", "-...", "-.-.", "-..", ".", "..-.", "--.",
"....", "..", ".---", "-.-", ".-..", "--", "-.",
"---", ".--.", "--.-", ".-.", "...", "-", "..-",
"...-", ".--", "-..-", "-.--", "--..",
// special characters
"...-."
};
//=================================================================
private int dur = 100; // (short) beep length (in ms)
private int tone = ToneGenerator.TONE_CDMA_DIAL_TONE_LITE;
private ToneGenerator gen = null;
声明 发音的声音选择 和时间间隔 的 时长 毫秒,构造方法来设定间隔和声音大小。
* @param dur int - speed parameter (duration of short beep in ms)
* @param vol int - speaker volume (0..100)
*/
public Morse(int dur, int vol) {
this.dur = dur;
gen = new ToneGenerator(AudioManager.STREAM_ALARM, vol);
}
初始化之后,把要播放的 字符串 拆分成单个字符 来分开播放或暂停,即当前线程暂停来实现
public void sendCode(String s) {
if (s == null)
return;
int len = s.length();
for (int i = 0; i < len; i++) {
if (Character.isSpaceChar(s.charAt(i))) {
int pause = 4;
delay(dur * pause);
} else sendChar(s.charAt(i));
}
}
其中 delay 方法
private void delay(int t) {
try {
Thread.sleep(t);
} catch (Exception e) {
}
}
其中 sendchar用来匹配字符对应的 电码来进行 发声;
private void sendChar(char ch) {
// 找到字符对应位置
int pos = KEYS.indexOf(ch);
if (pos != -1) {
//找到对应的电码符号
String code = CODES[pos];
int len = code.length();
// 遍历对应的电码字符串
for (int i = 0; i < len; i++) {
int pause = 0;
switch (code.charAt(i)) {
case '.':
gen.startTone(tone, dur);//1倍的长度
pause = 2;
break;
case '-':
gen.startTone(tone, 3 * dur);//三倍的长度
pause = 4;
break;
}
delay(pause * dur);
}
delay(4 * dur);
}
}
这样在 调用的时候
Morse beeper = new Morse(speed, volume);
handler.post(new Runnable() {
@Override
public void run() {
beeper.sendCode(et_input.getText().toString());
}
});
第一步,实现发声的功能实现了。