React Native中如何获取设备IMEI?调用react-native-imei报错如何解决
React Native 设备IMEI/唯一标识获取方案
你遇到的getImeiForSlot: the user 10265 does not need the requirement to access device identifiers报错核心原因不是代码写法问题,首先你贴的示例代码本身存在语法错误:
// 原错误写法,缺少from和引号 // import IMEI react-native-imei // 正确语法写法 import IMEI from 'react-native-imei'
但就算修正语法问题,你依然拿不到IMEI:从Android 10(API等级29)开始,安卓系统全面禁止普通第三方应用读取IMEI、MEID、序列号这类硬件级持久设备标识,哪怕申请了READ_PHONE_STATE权限也会直接抛出该权限错误。react-native-imei库已经停止维护多年,没有适配Android 10及以上系统,不存在修复可能。
以下是不同场景下的可行方案:
普通上架应用场景(推荐,全平台适配)
如果你的需求是做用户唯一识别、设备埋点、风控校验,不需要强制获取硬件IMEI,直接用无权限依赖的系统级唯一标识即可,不需要折腾无效的IMEI获取方案:
- 安卓端使用
ANDROID_ID:设备首次启动时生成的64位标识,应用卸载重装不会变更,仅恢复出厂设置或部分厂商系统大版本升级才会重置,无权限要求 - iOS端使用
IDFV(identifierForVendor):同开发者账号下的应用共享该标识,卸载同开发者所有应用后重装才会重置
直接使用维护活跃的成熟库react-native-device-info即可实现,步骤如下:
- 安装依赖
npm install react-native-device-info # iOS端需要执行pod安装 cd ios && pod install - 调用接口获取唯一ID,无需额外权限申请
该接口会自动根据平台返回对应合规的唯一标识,适配所有最新系统版本和RN版本,满足绝大多数业务场景。import DeviceInfo from 'react-native-device-info'; const deviceUniqueId = DeviceInfo.getUniqueId(); console.log(deviceUniqueId);
特殊内部应用场景(仅能获取Android9及以下设备IMEI)
如果你的应用是企业内部分发、系统预装、持运营商特殊签名的应用,不需要上架公开应用商店,可以按以下配置尝试获取IMEI:
- 将安卓构建配置中的
targetSdkVersion调整为28(Android 9)及以下,Android 10+系统依然无法获取 - 在
AndroidManifest.xml中添加权限声明<uses-permission android:name="android.permission.READ_PHONE_STATE" /> - 针对Android 6.0及以上设备,运行时动态申请
READ_PHONE_STATE权限,用户同意授权后再调用IMEI获取接口
注意:targetSdkVersion低于29的应用目前无法提交到Google Play及国内绝大多数主流应用商店,该方案仅适合非公开分发场景
无效方案避坑
- 所有声称无需系统签名/root即可在Android10+获取IMEI的方案、第三方库均为虚假宣传,要么是用ANDROID_ID等其他标识冒充IMEI,要么仅在root设备上生效,无法在普通用户量产设备上使用
- 反射调用系统隐藏接口、修改AppOps权限等操作需要系统级权限,普通应用无权限执行
内容的提问来源于stack exchange,提问作者Ghasem Khalili
相关产品推荐
相关产品推荐

