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

Android开发:不替换默认拨号应用使用InCallService方法的实现问询

Android 10+ 无需替换默认拨号应用控制通话扬声器方案

答案是可以实现,不需要替换系统默认拨号应用,也无需开发你不需要的拨号、接听等相关功能,有两种可行的实现路径:


路径1:通过TelecomManager直接控制通话音频路由(推荐,完全符合官方适配要求)

前置准备

  • 在AndroidManifest.xml中声明权限:
<!-- Android 10+ 修改音频路由所需权限,普通权限无需动态申请 -->
<uses-permission android:name="android.permission.MODIFY_AUDIO_ROUTING" />
<!-- 读取通话状态所需权限,危险权限需要动态申请用户授权 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

实现步骤

  1. 获取系统TelecomManager实例
TelecomManager telecomManager = getSystemService(Context.TELECOM_SERVICE);
  1. 遍历当前活跃通话,设置音频路由到扬声器
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
    List<Call> activeCalls = telecomManager.getCurrentCalls();
    for (Call call : activeCalls) {
        // 仅处理处于活跃状态的通话
        if (call.getState() == Call.STATE_ACTIVE) {
            // 开启扬声器
            call.setAudioRoute(CallAudioState.ROUTE_SPEAKER);
            // 如果需要切回听筒,改为调用 call.setAudioRoute(CallAudioState.ROUTE_EARPIECE)
            break;
        }
    }
}

该路径不需要你自定义实现InCallService,也不需要申请成为系统默认拨号应用,仅需要两个权限即可实现需求。


路径2:通过AudioManager直接设置通信设备(适配Android 12+更简单)

如果你的应用最小适配版本是Android 12,还可以用更简单的方案,不需要获取通话状态权限:

AudioManager audioManager = getSystemService(Context.AUDIO_SERVICE);
AudioDeviceInfo[] availableDevices = audioManager.getAvailableCommunicationDevices();
for (AudioDeviceInfo device : availableDevices) {
    if (device.getType() == AudioDeviceInfo.TYPE_BUILTIN_SPEAKER) {
        audioManager.setCommunicationDevice(device);
        break;
    }
}

仅需要android.permission.MODIFY_AUDIO_ROUTING权限即可生效。


注意事项

  • 部分国产定制ROM可能对通话相关权限有额外限制,如遇失效可以引导用户给应用开启「通话权限」「修改系统设置」权限
  • 以上方案均不需要修改系统默认拨号应用,也不需要开发多余的通话相关功能

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 05:45:02