自定义应用发起呼叫时SIM选择弹窗不可选,仅Google电话应用触发该问题
自研APP实现SIM选择呼叫功能的问题解决
手机设置中开启呼叫「始终询问」选项后,自研应用发起呼叫时弹出的SIM选择弹窗无法选择(选项禁用),即使指定特定SIM发起呼叫也存在相同问题。其他原生拨号器功能正常,仅Google电话应用会阻止SIM选择操作,需求是实现带SIM选择的呼叫功能。
解决步骤:
确认权限配置
必须在AndroidManifest.xml中声明并在运行时申请必要权限:<uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" />Android 6.0+版本需要动态申请
CALL_PHONE和READ_PHONE_STATE权限,否则无法访问双卡相关信息。使用标准双卡呼叫API构造Intent
避免直接调用简单的ACTION_CALL,针对双卡场景适配不同版本的API:String phoneNumber = "目标号码"; Intent callIntent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + phoneNumber)); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) { // 获取可用的SIM账户 TelecomManager telecomManager = (TelecomManager) getSystemService(Context.TELECOM_SERVICE); List<PhoneAccountHandle> accountHandles = telecomManager.getCallCapablePhoneAccounts(); if (accountHandles != null && !accountHandles.isEmpty()) { // 指定第一个SIM卡,可根据需求切换索引 callIntent.putExtra(android.telecom.TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, accountHandles.get(0)); } } else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP) { // Android 5.0 仅支持卡槽索引 callIntent.putExtra("com.android.phone.extra.slot", 0); } startActivity(callIntent);绕过Google电话应用的拦截
当Google电话作为默认拨号器时,会接管SIM选择逻辑,可通过以下方式处理:- 引导用户将自研APP设置为默认拨号器(系统设置-应用-默认应用-电话)
- 使用
TelecomManager的官方弹窗唤起SIM选择(Android 8.0+):if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { TelecomManager telecomManager = (TelecomManager) getSystemService(Context.TELECOM_SERVICE); if (telecomManager != null) { // 第三个参数true表示直接发起呼叫,false仅选择账户 telecomManager.showCallAccountPicker(Uri.parse("tel:" + phoneNumber), null, true); } }
测试不同系统版本的兼容性
部分定制ROM(如MIUI、EMUI)对双卡呼叫有特殊处理,需在对应设备上测试,必要时针对ROM做适配。
内容的提问来源于stack exchange,提问作者MuthuKrishnan
相关产品推荐
相关产品推荐

