获取设备IMEI/序列号遇权限不足问题,已加Manifest权限仍无效求助
解决内部应用获取IMEI/序列号权限不足的问题
核心限制说明
从Android 10(API 29)开始,普通应用无法获取IMEI、序列号等设备标识符,只有具备**设备所有者(Device Owner)或配置文件所有者(Profile Owner)**身份的应用才能获取这些信息——这是系统层面的强制限制,仅靠Manifest权限声明无法绕过。
具体排查与解决步骤
确认TestDPC的正确配置
你只是安装了TestDPC,但还需要将你的应用设为设备/配置文件所有者:- 连接设备到电脑,执行ADB命令:
# 设置为设备所有者 adb shell dpm set-device-owner com.your.package/.YourDeviceAdminReceiver # 或设置为工作配置文件所有者(适合企业场景) adb shell dpm set-profile-owner com.your.package/.YourDeviceAdminReceiver <user-id> - 确保你的应用已经注册了
DeviceAdminReceiver组件,并在Manifest中完成相关声明。
- 连接设备到电脑,执行ADB命令:
检查Manifest权限的完整性
除了READ_PHONE_STATE,还需要声明设备管理员权限:<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.BIND_DEVICE_ADMIN" /> <receiver android:name=".YourDeviceAdminReceiver" android:permission="android.permission.BIND_DEVICE_ADMIN"> <meta-data android:name="android.app.device_admin" android:resource="@xml/device_admin_receiver" /> <intent-filter> <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" /> </intent-filter> </receiver>同时在
res/xml目录下创建device_admin_receiver.xml,声明设备管理员权限范围:<device-admin xmlns:android="http://schemas.android.com/apk/res/android"> <uses-policies> <limit-password /> <watch-login /> <!-- 根据需求添加其他MDM相关策略 --> </uses-policies> </device-admin>验证包的调用逻辑
使用device_info_plus或device_imei时,需在获取IMEI前先检查应用是否具备所有者身份,否则会触发权限错误。例如在Flutter中:// 检查是否为设备所有者(需借助device_policy_manager相关API) bool isDeviceOwner = await DevicePolicyManager.isDeviceOwnerApp('com.your.package'); if (isDeviceOwner) { String? imei = await DeviceInfoPlugin().androidInfo.id; // 处理IMEI } else { // 无权限,提示或使用替代方案 }替代方案(若无法获取所有者身份)
如果你的应用无法成为设备/配置文件所有者,可考虑:- 通过MDM后台直接推送设备的IMEI/序列号到应用(MDM本身可以获取这些信息)
- 使用Android ID或OAID作为替代标识(注意:Android ID会在恢复出厂设置后改变,OAID由厂商提供,稳定性因设备而异)
内容的提问来源于stack exchange,提问作者Jordan McKoy
相关产品推荐
相关产品推荐

