Android 10及以上获取IMEI/IMSI/MAC地址的可行方案咨询
Android 10+ 设备识别(一机一登录)替代方案及设备配置控制器使用指南
一、非敏感信息的设备识别替代方案
Android 10+ 严格限制了IMEI、IMSI、MAC这类敏感标识符的获取权限,优先推荐以下合规替代方案实现一机一登录:
- Android ID:调用
Settings.Secure.ANDROID_ID获取,同一设备上的所有应用会获得相同值(恢复出厂设置后会重置),无需特殊权限。 - 自定义唯一ID:首次启动应用时生成UUID,存储到
SharedPreferences或本地文件,卸载重装会重置,适合不需要跨卸载识别的场景。 - 广告ID:依赖Google Play Services获取,用户可主动重置,适合非强制的识别场景。
二、设备配置控制器(DPC)与工作配置文件的适用性
DPC和工作配置文件主要面向企业管理场景,无法直接获取IMEI/IMSI/MAC,但可通过以下方式实现设备级识别:
- 工作配置文件是与个人空间隔离的独立容器,同一设备的工作配置有唯一标识符,可用于工作范围内的一机一登录。
- DPC应用可管理设备的工作配置,通过绑定设备的工作配置ID实现识别,全程无需敏感权限。
三、DPC与工作配置文件的使用步骤及示例
1. 添加依赖
在build.gradle中引入必要依赖:
dependencies { implementation 'androidx.work:work-runtime:2.8.1' implementation 'com.google.android.gms:play-services-management:17.0.0' }
2. 实现DPC核心接收器
创建继承自DeviceAdminReceiver的广播接收器,处理工作配置初始化完成事件:
public class MyDeviceAdminReceiver extends DeviceAdminReceiver { @Override public void onProfileProvisioningComplete(Context context, Intent intent) { super.onProfileProvisioningComplete(context, intent); // 获取工作配置文件的唯一ID String profileId = getProfileUniqueId(context); // 将profileId传入后端做一机一登录验证 Log.d("DPC_DEMO", "工作配置ID: " + profileId); } private String getProfileUniqueId(Context context) { DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE); ComponentName adminComponent = new ComponentName(context, MyDeviceAdminReceiver.class); return dpm.getProfileOwnerId(adminComponent); } }
3. 注册DPC组件
在AndroidManifest.xml中注册接收器并声明权限:
<uses-permission android:name="android.permission.BIND_DEVICE_ADMIN" /> <receiver android:name=".MyDeviceAdminReceiver" android:permission="android.permission.BIND_DEVICE_ADMIN"> <meta-data android:name="android.app.device_admin" android:resource="@xml/device_admin" /> <intent-filter> <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" /> <action android:name="android.app.action.PROFILE_PROVISIONING_COMPLETE" /> </intent-filter> </receiver>
4. 创建设备管理配置文件
在res/xml/下新建device_admin.xml,配置DPC权限范围:
<device-admin xmlns:android="http://schemas.android.com/apk/res/android"> <uses-policies> <manage-profile /> <limit-password /> <force-lock /> </uses-policies> </device-admin>
5. 触发工作配置创建流程
在应用中启动工作配置初始化:
public void initWorkProfile(Context context) { Intent provisionIntent = new Intent(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE); provisionIntent.putExtra(DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, new ComponentName(context, MyDeviceAdminReceiver.class).flattenToString()); if (provisionIntent.resolveActivity(context.getPackageManager()) != null) { context.startActivity(provisionIntent); } }
四、注意事项
- 工作配置文件仅适用于企业场景,普通消费级应用使用可能增加用户操作成本,需评估业务适配性。
- 所有合规方案都无法完全替代IMEI的永久唯一性(如恢复出厂设置会重置Android ID),需根据业务容忍度选择合适方案。
内容的提问来源于stack exchange,提问作者Renuka Sachin
相关产品推荐
相关产品推荐

