Android设备获取IMEI无过时警告的替代方法及警告原因咨询
关于Android获取IMEI时的过时警告问题解答
为什么会出现TelephonyManager.DeviceId过时警告?
从Android 10(API 29)开始,Google为了强化用户隐私保护,严格限制了IMEI这类敏感设备标识符的获取权限。DeviceId这个API正是因为涉及用户隐私,且在高版本系统中普通应用已无法正常获取有效数据(会返回null或空字符串),所以被标记为过时(deprecated)。简单来说,Google不推荐开发者再用这个方法来获取IMEI了。
有没有不触发警告的替代方法?
有的,但要分Android版本处理,同时还要注意权限限制:
1. 针对Android 10(API 29)及以上版本
可以使用TelephonyManager.Imei(单卡设备)或TelephonyManager.Imei(int slotIndex)(双卡设备,传入卡槽索引,比如0或1)来获取IMEI。但要注意:
- 只有系统应用、设备厂商预安装的应用,或者拥有
READ_PRIVILEGED_PHONE_STATE特殊权限的应用,才能成功获取到IMEI; - 普通应用即使申请了
READ_PHONE_STATE权限,在Android 10+上调用这个方法也会抛出SecurityException,或者返回null。
2. 兼容低版本Android(API 28及以下)
低版本系统还是可以继续使用DeviceId,但可以通过#pragma临时抑制过时警告,就像你之前做的那样。
给你整理一份兼容多版本的代码示例:
Android.Telephony.TelephonyManager mTelephonyMgr = (Android.Telephony.TelephonyManager)Forms.Context.GetSystemService(Android.Content.Context.TelephonyService); string imei = null; if (Build.VERSION.SdkInt >= BuildVersionCodes.Q) { // 处理Android 10及以上版本 try { // 单卡设备直接用Imei,双卡设备传入卡槽索引,比如Imei(0) imei = mTelephonyMgr.Imei; } catch (SecurityException ex) { // 没有权限,这里可以做异常处理,比如提示用户或使用替代标识符 Console.WriteLine("无法获取IMEI:" + ex.Message); } } else { // 处理Android 9及以下版本,临时抑制过时警告 #pragma warning disable CS0618 // Type or member is obsolete imei = mTelephonyMgr.DeviceId; #pragma warning restore CS0618 // Type or member is obsolete } return imei;
补充:如果你的应用是普通应用(非系统/预安装)
在Android 10+上是拿不到IMEI的,建议考虑使用更隐私友好的替代标识符,比如AndroidId(Settings.Secure.ANDROID_ID),这个值在设备恢复出厂设置后会重置,但不需要特殊权限,适合大多数普通应用的标识需求。
内容的提问来源于stack exchange,提问作者Judson Abraham
相关产品推荐
相关产品推荐

