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

Android Studio中如何获取双卡手机号及SIM卡信息?代码返回null求助

解决Android获取手机号(双卡)返回null的问题

我来帮你一步步排查和解决这个问题,先说说为什么你当前的代码会返回null,再给出可行的解决方案:

为什么getLine1Number()返回null?

  • 运营商未写入手机号到SIM卡:这是最常见的原因,很多运营商不会把用户的手机号存储到SIM卡的EF_MSISDN字段中,系统自然无法读取到。
  • 权限问题:你只添加了静态权限,但Android 6.0(API Level 23)及以上版本需要动态申请危险权限,READ_PHONE_STATE属于危险权限,仅静态声明是不够的。
  • 双卡设备适配不足:旧版TelephonyManager只能获取默认SIM卡的信息,无法直接处理双卡场景,需要用专门的API来遍历所有SIM卡。

具体解决方案

1. 动态申请权限

在调用获取手机号的代码前,先检查并申请READ_PHONE_STATE权限:

private static final int REQUEST_READ_PHONE_STATE = 101;

// 检查权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)
        != PackageManager.PERMISSION_GRANTED) {
    // 申请权限
    ActivityCompat.requestPermissions(this,
            new String[]{Manifest.permission.READ_PHONE_STATE},
            REQUEST_READ_PHONE_STATE);
} else {
    // 权限已授予,执行获取手机号逻辑
    fetchPhoneNumbers();
}

// 处理权限申请结果
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == REQUEST_READ_PHONE_STATE) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            fetchPhoneNumbers();
        } else {
            // 用户拒绝权限,提示无法获取手机号
            Toast.makeText(this, "需要授予权限才能获取手机号", Toast.LENGTH_SHORT).show();
        }
    }
}

2. 适配双卡设备获取所有SIM卡信息

使用SubscriptionManager来获取所有可用的SIM卡订阅信息,再针对每个SIM卡获取对应的手机号:

private void fetchPhoneNumbers() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
        SubscriptionManager subscriptionManager =
                (SubscriptionManager) getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
        
        // 获取所有活跃的SIM卡订阅
        List<SubscriptionInfo> subscriptionInfoList =
                subscriptionManager.getActiveSubscriptionInfoList();
        
        if (subscriptionInfoList != null) {
            StringBuilder sb = new StringBuilder();
            for (SubscriptionInfo info : subscriptionInfoList) {
                int subscriptionId = info.getSubscriptionId();
                // 创建对应SIM卡的TelephonyManager
                TelephonyManager telephonyManager =
                        (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    telephonyManager = telephonyManager.createForSubscriptionId(subscriptionId);
                }
                
                String phoneNumber = telephonyManager.getLine1Number();
                sb.append("SIM卡").append(info.getSimSlotIndex() + 1)
                        .append(": ").append(phoneNumber == null ? "无法获取" : phoneNumber)
                        .append("\n");
            }
            phone_number.setText(sb.toString());
        } else {
            phone_number.setText("未检测到SIM卡");
        }
    } else {
        // 低于API22的设备,只能获取默认卡信息
        TelephonyManager tMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        String phoneNumber = tMgr.getLine1Number();
        phone_number.setText(phoneNumber == null ? "无法获取手机号" : phoneNumber);
    }
}

3. 额外说明

即使完成了上述步骤,仍然可能获取不到手机号,因为这完全取决于运营商是否将手机号写入了SIM卡的对应存储字段。如果确实需要获取用户手机号,建议通过短信验证码验证的方式来获取,这是更可靠的方案。


内容的提问来源于stack exchange,提问作者dyan tb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:18:05