使用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
相关产品推荐
相关产品推荐

