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" />
实现步骤
- 获取系统TelecomManager实例
TelecomManager telecomManager = getSystemService(Context.TELECOM_SERVICE);
- 遍历当前活跃通话,设置音频路由到扬声器
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
相关产品推荐
相关产品推荐

