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

如何在Android中编程获取双卡设备的全部SIM卡手机号

Android双卡设备获取两张SIM卡手机号实现方案

你当前使用的SubscriptionManager思路是正确的,补全权限校验、遍历逻辑以及号码获取方法即可拿到两张SIM卡的手机号,注意该方案仅支持Android 5.1(API 22)及以上系统。

1. 权限配置

首先需要在AndroidManifest.xml中声明对应权限,同时运行时动态申请,两类权限都到位才能正常获取号码:

<!-- Android 11以下仅需声明该权限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- Android 11及以上需要额外声明读取手机号专属权限 -->
<uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />

以上两个权限均属于Android危险权限,必须在代码中动态申请,用户手动同意后才能调用后续接口。

2. 完整实现代码

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
    SubscriptionManager subscriptionManager = (SubscriptionManager) getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
    // 权限校验
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED
        && ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_NUMBERS) != PackageManager.PERMISSION_GRANTED) {
        // 此处补充动态申请权限逻辑,权限申请通过后再执行后续代码
        return;
    }
    // 获取所有激活状态的SIM卡信息,双卡设备正常会返回2条数据
    List<SubscriptionInfo> activeSimList = subscriptionManager.getActiveSubscriptionInfoList();
    if (activeSimList != null && !activeSimList.isEmpty()) {
        for (SubscriptionInfo simInfo : activeSimList) {
            // 卡槽编号,0对应卡槽1,1对应卡槽2
            int slotIndex = simInfo.getSimSlotIndex();
            // 读取手机号
            String phoneNum = simInfo.getNumber();
            // 读取运营商名称
            String carrier = simInfo.getCarrierName().toString();
            // 此处可根据业务需求存储对应卡槽的手机号
        }
    }
} else {
    // Android 5.1以下系统不支持双卡相关API,仅能获取默认SIM卡手机号
    TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
        String defaultPhone = telephonyManager.getLine1Number();
    }
}

3. 常见注意事项

  • 返回手机号为空:该现象属于正常情况,手机号并非强制写入SIM卡的字段,部分运营商不会将手机号存储在SIM卡对应区域,这种情况无法通过本地接口直接获取手机号,需要通过短信验证、调用运营商接口等其他方式获取。
  • 卡槽编号与实际物理卡槽不匹配:部分厂商定制ROM会将默认流量卡/通话卡标记为卡槽0,和实际物理插入顺序不一定完全对应,需要根据业务场景做适配。
  • 高版本系统适配:Android 12/13/14版本均兼容该方案,仅需按要求申请对应权限即可正常调用。

内容的提问来源于stack exchange,提问作者user16647221-SIMJEC

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 04:21:03