You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:52:08