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

使用ACTION_CALL时双卡设备SIM选择选项被禁用的问题求助

双卡设备使用ACTION_CALL直接拨号异常的解决办法

问题背景

已获取CALL_PHONE权限,调用ACTION_CALL意图直接拨号时,部分设置为「始终询问」的双卡设备会弹出SIM选择对话框,甚至出现两个SIM选项均被禁用的情况。

可行解决方案

1. 指定SIM卡发起呼叫(Android 5.1+ 通用方案)

Android 5.1(API 22)及以上系统支持通过TelecomManager指定SIM卡发起呼叫,既能跳过SIM选择对话框,也能规避选项禁用问题。

实现代码:

private void openCallIntent(String number, boolean needCountryCode) {
    try {
        String telUri = needCountryCode ? "tel:+" + number : "tel:" + number;
        Intent callIntent = new Intent(Intent.ACTION_CALL, Uri.parse(telUri));

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
            TelecomManager telecomManager = (TelecomManager) getSystemService(Context.TELECOM_SERVICE);
            if (telecomManager != null) {
                // 获取所有可发起呼叫的SIM账户
                List<PhoneAccountHandle> availableAccounts = telecomManager.getCallCapablePhoneAccounts();
                if (!availableAccounts.isEmpty()) {
                    // 传入第一个可用SIM账户(可根据业务逻辑改为用户预设的SIM)
                    callIntent.putExtra(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, availableAccounts.get(0));
                }
            }
        }

        startActivity(callIntent);
    } catch (ActivityNotFoundException e) {
        // 处理拨号应用不存在的异常
        e.printStackTrace();
    } catch (SecurityException e) {
        // 处理权限缺失异常
        e.printStackTrace();
    }
}

权限要求:

  • 除CALL_PHONE外,需动态申请READ_PHONE_STATE(Android 12及以下);Android 13+需申请READ_PHONE_NUMBERS或READ_PHONE_STATE(根据系统版本适配)。

2. 修复SIM选项禁用问题

若出现SIM选项均禁用的情况,需排查:

  • 确认应用已获得READ_PHONE_STATE(或对应高版本权限),且用户未在系统设置中撤销权限;
  • 部分定制ROM会限制第三方应用访问SIM信息,需在应用权限设置中开启「读取电话状态」权限。

3. 适配定制ROM(备选方案)

部分国产ROM对双卡拨号有私有逻辑,若通用方案无效,可尝试适配厂商私有API(如小米的EXTRA_SLOT_ID、华为的EXTRA_SIM_ID),但该方案兼容性差,仅作为最后手段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 09:47:17