以下是一个基于 Tone Generator 的解决方案,它在 DialogFragment 中使用 ontouch 侦听器,看起来很稳定。在 OnViewCreated 方法中为每个按钮设置 onTouchListeners,然后使用以下 ontouch 侦听器方法,在触摸按钮时通过 SIP 呼叫连续播放选定的 DTMF 音,然后在不再触摸按钮时停止播放。AnswerDialogListener 是 MainActivity 的回调。
编辑:我通过尝试使用toneType = ToneGenerator.TONE_DTMF_0; 来修复编译器警告,破坏了以前工作的DTMF音RFC2833正确输出;而不是toneType =toneGenerator.TONE_DTMF_0;
private View.OnTouchListener myTouchListener = new View.OnTouchListener(){
public boolean onTouch(View v, MotionEvent event) {
String callidText = callid;
AnswerDialogListener listener = (AnswerDialogListener) getActivity();
int streamType = AudioManager.STREAM_MUSIC;
int volume = 50;
if(event.getAction() == MotionEvent.ACTION_DOWN) {
switch (v.getId()) {
case R.id.answer_dialog_0_button:
toneGenerator = new ToneGenerator(streamType, volume);
toneGenerator.getAudioSessionId();
listener.onAnswerResponse(callidText, "Keypad0");
toneType = toneGenerator.TONE_DTMF_0;
toneGenerator.startTone(toneType);
return true;
case R.id.answer_dialog_1_button:
toneGenerator = new ToneGenerator(streamType, volume);
toneGenerator.getAudioSessionId();
listener.onAnswerResponse(callidText, "Keypad1");
toneType = toneGenerator.TONE_DTMF_1;
toneGenerator.startTone(toneType);
return true;
case R.id.answer_dialog_2_button:
toneGenerator = new ToneGenerator(streamType, volume);
toneGenerator.getAudioSessionId();
listener.onAnswerResponse(callidText, "Keypad2");
toneType = toneGenerator.TONE_DTMF_2;
toneGenerator.startTone(toneType);
return true;
case R.id.answer_dialog_3_button:
toneGenerator = new ToneGenerator(streamType, volume);
toneGenerator.getAudioSessionId();
listener.onAnswerResponse(callidText, "Keypad3");
toneType = toneGenerator.TONE_DTMF_3;
toneGenerator.startTone(toneType);
return true;
case R.id.answer_dialog_4_button:
toneGenerator = new ToneGenerator(streamType, volume);
toneGenerator.getAudioSessionId();
listener.onAnswerResponse(callidText, "Keypad4");
toneType = toneGenerator.TONE_DTMF_4;
toneGenerator.startTone(toneType);
return true;
case R.id.answer_dialog_5_button:
toneGenerator = new ToneGenerator(streamType, volume);
toneGenerator.getAudioSessionId();
listener.onAnswerResponse(callidText, "Keypad5");
toneType = toneGenerator.TONE_DTMF_5;
toneGenerator.startTone(toneType);
return true;
case R.id.answer_dialog_6_button:
toneGenerator = new ToneGenerator(streamType, volume);
toneGenerator.getAudioSessionId();
listener.onAnswerResponse(callidText, "Keypad6");
toneType = toneGenerator.TONE_DTMF_6;
toneGenerator.startTone(toneType);
return true;
case R.id.answer_dialog_7_button:
toneGenerator = new ToneGenerator(streamType, volume);
toneGenerator.getAudioSessionId();
listener.onAnswerResponse(callidText, "Keypad7");
toneType = toneGenerator.TONE_DTMF_7;
toneGenerator.startTone(toneType);
return true;
case R.id.answer_dialog_8_button:
toneGenerator = new ToneGenerator(streamType, volume);
toneGenerator.getAudioSessionId();
listener.onAnswerResponse(callidText, "Keypad8");
toneType = toneGenerator.TONE_DTMF_8;
toneGenerator.startTone(toneType);
return true;
case R.id.answer_dialog_9_button:
toneGenerator = new ToneGenerator(streamType, volume);
toneGenerator.getAudioSessionId();
listener.onAnswerResponse(callidText, "Keypad9");
toneType = toneGenerator.TONE_DTMF_9;
toneGenerator.startTone(toneType);
return true;
case R.id.answer_dialog_asterisk_button:
toneGenerator = new ToneGenerator(streamType, volume);
toneGenerator.getAudioSessionId();
listener.onAnswerResponse(callidText, "KeypadAsterisk");
toneType = toneGenerator.TONE_DTMF_S;
toneGenerator.startTone(toneType);
return true;
case R.id.answer_dialog_hash_button:
toneGenerator = new ToneGenerator(streamType, volume);
toneGenerator.getAudioSessionId();
listener.onAnswerResponse(callidText, "KeypadHash");
toneType = toneGenerator.TONE_DTMF_P;
toneGenerator.startTone(toneType);
return true;
}
}
if(event.getAction() == MotionEvent.ACTION_UP) {
switch (v.getId()) {
case R.id.answer_dialog_0_button:
toneGenerator.stopTone();
toneGenerator.release();
return true;
case R.id.answer_dialog_1_button:
toneGenerator.stopTone();
toneGenerator.release();
return true;
case R.id.answer_dialog_2_button:
toneGenerator.stopTone();
toneGenerator.release();
return true;
case R.id.answer_dialog_3_button:
toneGenerator.stopTone();
toneGenerator.release();
return true;
case R.id.answer_dialog_4_button:
toneGenerator.stopTone();
toneGenerator.release();
return true;
case R.id.answer_dialog_5_button:
toneGenerator.stopTone();
toneGenerator.release();
return true;
case R.id.answer_dialog_6_button:
toneGenerator.stopTone();
toneGenerator.release();
return true;
case R.id.answer_dialog_7_button:
toneGenerator.stopTone();
toneGenerator.release();
return true;
case R.id.answer_dialog_8_button:
toneGenerator.stopTone();
toneGenerator.release();
return true;
case R.id.answer_dialog_9_button:
toneGenerator.stopTone();
toneGenerator.release();
return true;
case R.id.answer_dialog_asterisk_button:
toneGenerator.stopTone();
toneGenerator.release();
return true;
case R.id.answer_dialog_hash_button:
toneGenerator.stopTone();
toneGenerator.release();
return true;
}
}
return false;
}
};
以下是 MainActivity 回调处理程序中的 if 语句片段,用于在活动 SIP 呼叫上输出 DTMF:
if (response.equals("Keypad0")) {
try {
if (call != null) {
call.sendDtmf(0);
}
} catch (Exception e) {
e.printStackTrace();
}
} else if (response.equals("Keypad1")) {
try {
if (call != null) {
call.sendDtmf(1);
}
} catch (Exception e) {
e.printStackTrace();
}
}