You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Twilio Android Voice SDK中检测DTMF按键音?

在Android Twilio Voice SDK中检测对方DTMF按键的最佳方案

你找的方向完全正确,Twilio Voice Android SDK确实内置了监听对方DTMF按键的接口,不需要绕路用第三方音频库或服务器端逻辑。下面直接说具体实现:

核心实现:利用Call.Listener的onDtmfReceived回调

当你发起或接听通话时,只需要在创建Call对象时传入自定义的Call.Listener,并重写onDtmfReceived方法即可直接获取对方发送的DTMF按键:

// 创建自定义通话监听器
Call.Listener callListener = new Call.Listener() {
    @Override
    public void onDtmfReceived(Call call, char digit, long duration) {
        // 这里处理接收到的DTMF按键
        // digit参数就是对方按下的键(0-9、*、#)
        // duration是按键按下的时长(毫秒)
        Log.i("DTMF检测", "收到按键:" + digit + ",时长:" + duration + "ms");
        // 在这里可以触发你的业务逻辑,比如更新UI、执行对应操作
    }

    // 别忘了实现其他必要的通话生命周期回调
    @Override
    public void onConnected(Call call) {
        Log.i("通话状态", "通话已连接");
    }

    @Override
    public void onDisconnected(Call call, CallException error) {
        String disconnectReason = error != null ? error.getMessage() : "正常挂断";
        Log.i("通话状态", "通话断开:" + disconnectReason);
    }

    @Override
    public void onConnectFailure(Call call, CallException error) {
        Log.e("通话错误", "连接失败:" + error.getMessage());
    }
};

// 发起通话时传入这个监听器
Call call = Voice.call(context, yourAccessToken, callParameters, callListener);

这个回调是Twilio SDK直接传递的,不需要你处理音频流,完全是封装好的上层API,也是官方推荐的方案。


关于你提到的其他方案的分析

方案二:本地音频流检测(如TarsosDSP+Goertzel算法)

这个方案不可行,因为Twilio Voice SDK不会向应用层暴露原始通话音频流,你无法获取到用于检测的音频数据,所以这条路走不通。

方案三:服务器端TWIML Gather检测

虽然可以实现,但步骤繁琐且有延迟:

  1. 你需要用TWIML的<Gather>动词在Twilio服务器端监听通话中的DTMF
  2. 检测到按键后,需要通过Webhook或推送通知把按键信息发送回你的Android应用
  3. 还要处理服务器到客户端的通信可靠性问题

相比客户端直接监听,这个方案多了很多中间环节,效率和实时性都不如前者,只适合一些必须在服务器端处理按键逻辑的场景。


注意事项

  • 确保使用最新版本的Twilio Voice Android SDK,旧版本可能没有这个回调接口
  • 测试时确认对方设备确实发送了DTMF(比如用普通电话按键盘,或另一个Twilio应用调用sendDigits),你听到的提示音是系统反馈,不影响SDK接收按键信息

内容的提问来源于stack exchange,提问作者Arturo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:34:43