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

Android中如何在onCallAdded回调获取当前通话对应的SIM卡槽及手机号

兼容实现方案

API 30及以上版本

直接使用官方提供的稳定API即可,需提前申请READ_PHONE_STATE权限:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
    int subscriptionId = telephonyManager.getSubscriptionId(call.getDetails().getAccountHandle());
    SubscriptionInfo subInfo = SubscriptionManager.from(context).getActiveSubscriptionInfo(subscriptionId);
    if (subInfo != null) {
        int simSlotIndex = subInfo.getSimSlotIndex(); // 卡槽编号,0为卡1,1为卡2
        String localPhoneNumber = subInfo.getNumber(); // 本机手机号
    }
}

API 23 ~ API 29版本

之前的映射方案失效是因为PhoneAccountHandle.getId()返回值不再是纯数字的subscriptionId,大部分厂商系统会给返回值增加自定义前缀,只需提取返回字符串中的数字部分即可完成匹配:

else {
    String accountId = call.getDetails().getAccountHandle().getId();
    int subscriptionId = -1;
    try {
        // 过滤所有非数字字符,提取subscriptionId
        String idNumPart = accountId.replaceAll("[^0-9]", "");
        subscriptionId = Integer.parseInt(idNumPart);
    } catch (NumberFormatException e) {
        // 匹配失败可使用广播监听备选方案
    }
    if (subscriptionId != -1) {
        SubscriptionInfo subInfo = SubscriptionManager.from(context).getActiveSubscriptionInfo(subscriptionId);
        if (subInfo != null) {
            int simSlotIndex = subInfo.getSimSlotIndex();
            String localPhoneNumber = subInfo.getNumber();
        }
    }
}

补充说明

  • 部分运营商SIM卡未将手机号写入芯片,getNumber()会返回空值,属于正常情况,无法通过系统API获取该信息
  • 少数定制系统如果上述方案不生效,可备选监听android.intent.action.PHONE_STATE广播,广播携带的subscription字段即为当前通话对应的subscriptionId,可用来和当前Call实例做关联
  • 所有版本都需要申请READ_PHONE_STATE权限,Android 6.0及以上需动态申请该权限

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 15:15:03