React Native如何自动检测用户设备所有SIM卡的手机号码?
React Native 双卡手机号码获取实现方案
注意:受系统隐私限制,iOS 全版本无公开API支持读取SIM卡手机号,以下方案仅适用于安卓端;安卓6.0(API 23)以下版本无官方双卡支持接口
可用方案:使用维护中的双卡信息读取库
你之前使用的react-native-sim-data已停止维护多年,不支持新版React Native、安卓12及以上系统;react-native-device-info的手机号读取接口本身仅返回默认卡槽号码,未做双卡适配,推荐替换为react-native-sim-cards-manager实现需求,接入步骤如下:
- 安装依赖
npm install react-native-sim-cards-manager # 或使用yarn yarn add react-native-sim-cards-manager - 配置安卓权限
打开项目路径下android/app/src/main/AndroidManifest.xml文件,添加所需权限:<!-- 基础读手机状态权限 --> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 安卓12(API31)及以上需要额外加读手机号权限 --> <uses-permission android:name="android.permission.READ_PHONE_NUMBERS" /> - 业务代码中动态申请权限并读取双卡信息
import SimCardsManager from 'react-native-sim-cards-manager'; import { PermissionsAndroid, Platform } from 'react-native'; const fetchDualSimNumbers = async () => { if (Platform.OS !== 'android') return []; // 组装需要申请的权限列表 const permissionList = [PermissionsAndroid.PERMISSIONS.READ_PHONE_STATE]; if (Platform.Version >= 31) { permissionList.push(PermissionsAndroid.PERMISSIONS.READ_PHONE_NUMBERS); } // 动态申请权限 const permissionResult = await PermissionsAndroid.requestMultiple(permissionList); const isAllPermitted = Object.values(permissionResult).every( res => res === PermissionsAndroid.RESULTS.GRANTED ); if (!isAllPermitted) return []; // 读取全部SIM卡信息 try { const simList = await SimCardsManager.getSimCards(); return simList.map(sim => ({ slotIndex: sim.slotIndex, // 卡槽索引,0为卡1、1为卡2 carrierName: sim.carrierName, // 所属运营商名称 phoneNumber: sim.phoneNumber, // 对应手机号码 countryIso: sim.countryIso, // SIM卡归属国家代码 })); } catch (err) { console.error('读取SIM卡信息失败', err); return []; } };
注意事项
- 存在读取不到号码的场景:部分运营商不会将用户手机号(MSISDN)写入SIM卡存储区,这种场景下接口返回的
phoneNumber字段为空,属于运营商侧限制,无通用技术方案绕过,需要引导用户手动输入手机号。 - 如果现成库无法满足定制需求,可以自行编写React Native原生模块封装安卓系统的
SubscriptionManager类,调用getActiveSubscriptionInfoList()方法即可获取全部活跃SIM卡的信息,自行处理数据回传逻辑即可。
预期实现效果参考

内容的提问来源于stack exchange,提问作者Shail Patel
相关产品推荐
相关产品推荐

