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

