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

使用Visual Studio 2017和Xamarin获取IMEI时返回空白问题

问题原因&解决方案

问题根因

  • 权限缺失:Android 6.0(API 23)及以上版本,READ_PHONE_STATE为危险权限,仅在AndroidManifest.xml静态声明无效,必须运行时主动申请用户授权,未授权时调用DeviceId接口会返回空值。
  • 接口废弃限制:Android 10(API 29)及以上系统,官方禁止第三方应用获取IMEI、MEID等不可重置的设备硬件标识符,即便授予权限调用DeviceId也会返回空或null。
  • 硬件不支持:无通话功能的平板、IoT设备本身不具备IMEI标识,调用接口自然返回空。

适配方案

1. 低版本系统(Android 9及以下)获取IMEI的正确写法

首先在AndroidManifest.xml中声明权限:

<uses-permission android:name="android.permission.READ_PHONE_STATE" />

运行时申请权限后再调用获取逻辑,示例代码如下:

// 先检查是否已经获得权限
if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.ReadPhoneState) == Permission.Granted)
{
    Android.Telephony.TelephonyManager mTelephonyMgr = (Android.Telephony.TelephonyManager)GetSystemService(Context.TelephonyService);
    m_deviceId = mTelephonyMgr.DeviceId;
}
else
{
    // 未授权,发起运行时权限申请
    ActivityCompat.RequestPermissions(this, new string[] { Manifest.Permission.ReadPhoneState }, 1001);
}
// 重写OnRequestPermissionsResult方法接收授权结果,授权通过后再调用获取DeviceId逻辑即可

2. Android 10及以上版本替代方案

Android 10开始不允许第三方应用获取IMEI,不要继续使用DeviceId作为设备唯一标识,可根据业务场景选择合规替代方案:

  • 若需要广告场景通用标识,使用可由用户重置的广告ID
  • 若仅需要应用内使用的设备标识,使用Android ID,同设备同签名应用不会变更,示例代码:
string androidId = Android.OS.Settings.Secure.GetString(ContentResolver, Android.OS.Settings.Secure.AndroidId);

内容的提问来源于stack exchange,提问作者umair haidri khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 06:12:04