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
相关产品推荐
相关产品推荐

