我是靠谱客的博主 着急棉花糖,最近开发中收集的这篇文章主要介绍Android 10 使用getDeviceId()和getIMEI()的问题及方案问题背景:问题原因解决方案,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

问题背景:

应用升级了targetSDKVersion 到api 29,也就是Android 10,之前一些应用内用到getDeviceIdgetIMEI就出了问题,但是调用这些api的时候,都进行了try catch,但是在小米9手机上还是会崩溃:

AndroidRuntime: FATAL EXCEPTION: Thread-4326
E AndroidRuntime: Process: xxx, PID: 13895
E AndroidRuntime:java.lang.SecurityException: getDeviceId: The user 10222 does not meet the requirements to access device identifiers.
E AndroidRuntime: at android.os.Parcel.createException(Parcel.java:2074)
E AndroidRuntime: at android.os.Parcel.readException(Parcel.java:2042)
E AndroidRuntime: at android.os.Parcel.readException(Parcel.java:1990)
E AndroidRuntime: at com.android.internal.telephony.ITelephonystubProxy.getDeviceId(ITelephony.java:10389)
E AndroidRuntime: at android.telephony.TelephonyManager.getDeviceId(TelephonyManager.java:1629)

我猜测和小米的room有关,在这先不进一步讨论了

问题原因

从 Android 10 开始,应用必须具有 READ_PRIVILEGED_PHONE_STATE 特许权限才能访问设备的不可重置标识符(包含 IMEI 和序列号)。

注意:从 Google Play 商店安装的第三方应用无法声明特许权限。

受影响的方法包括:

  • Build
    • getSerial()
  • TelephonyManager
    • getImei()
    • getDeviceId()
    • getMeid()
    • getSimSerialNumber()
    • getSubscriberId()

如果您的应用没有该权限,但您仍尝试查询不可重置标识符的相关信息,则平台的响应会因目标 SDK 版本而异:

  • 如果应用以 Android 10 或更高版本为目标平台,则会发生 SecurityException
  • 如果应用以 Android 9(API 级别 28)或更低版本为目标平台,则相应方法会返回 null 或占位符数据(如果应用具有 READ_PHONE_STATE 权限)。否则,会发生 SecurityException

注意:如果您的应用是设备所有者或资料所有者应用,那么即使您的应用以 Android 10 或更高版本为目标平台,您也只需 READ_PHONE_STATE 权限即可访问不可重置的设备标识符。此外,如果您的应用具有特殊运营商权限,则无需任何权限即可访问这些标识符。

许多使用场景都不需要不可重置的设备标识符。例如,如果您的应用将不可重置的设备标识符用于广告跟踪或用户分析目的,请为这些特定使用场景使用 Android 广告 ID。要了解详情,请参阅唯一标识符的最佳做法。

具体可以参考这篇文章:android 10 的隐私权和位置信息

解决方案

代码:

public static String getIMEIDeviceId(Context context) {
<span class="token class-name">String</span> deviceId<span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token class-name">Build</span><span class="token punctuation">.</span>VERSION<span class="token punctuation">.</span>SDK_INT <span class="token operator">&gt;=</span> <span class="token class-name">Build</span><span class="token punctuation">.</span>VERSION_CODES<span class="token punctuation">.</span><span class="token class-name">Q</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
deviceId <span class="token operator">=</span> <span class="token class-name">Settings</span><span class="token punctuation">.</span><span class="token class-name">Secure</span><span class="token punctuation">.</span><span class="token function">getString</span><span class="token punctuation">(</span>context<span class="token punctuation">.</span><span class="token function">getContentResolver</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token class-name">Settings</span><span class="token punctuation">.</span><span class="token class-name">Secure</span><span class="token punctuation">.</span>ANDROID_ID<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
<span class="token keyword">final</span> <span class="token class-name">TelephonyManager</span> mTelephony <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token class-name">TelephonyManager</span><span class="token punctuation">)</span> context<span class="token punctuation">.</span><span class="token function">getSystemService</span><span class="token punctuation">(</span><span class="token class-name">Context</span><span class="token punctuation">.</span>TELEPHONY_SERVICE<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token class-name">Build</span><span class="token punctuation">.</span>VERSION<span class="token punctuation">.</span>SDK_INT <span class="token operator">&gt;=</span> <span class="token class-name">Build</span><span class="token punctuation">.</span>VERSION_CODES<span class="token punctuation">.</span><span class="token class-name">M</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>context<span class="token punctuation">.</span><span class="token function">checkSelfPermission</span><span class="token punctuation">(</span><span class="token class-name">Manifest</span><span class="token punctuation">.</span>permission<span class="token punctuation">.</span>READ_PHONE_STATE<span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token class-name">PackageManager</span><span class="token punctuation">.</span>PERMISSION_GRANTED<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token string">""</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">assert</span> mTelephony <span class="token operator">!=</span> <span class="token keyword">null</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>mTelephony<span class="token punctuation">.</span><span class="token function">getDeviceId</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token keyword">null</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token class-name">Build</span><span class="token punctuation">.</span>VERSION<span class="token punctuation">.</span>SDK_INT <span class="token operator">&gt;=</span> <span class="token class-name">Build</span><span class="token punctuation">.</span>VERSION_CODES<span class="token punctuation">.</span><span class="token class-name">O</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
deviceId <span class="token operator">=</span> mTelephony<span class="token punctuation">.</span><span class="token function">getImei</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token keyword">else</span> <span class="token punctuation">{</span>
deviceId <span class="token operator">=</span> mTelephony<span class="token punctuation">.</span><span class="token function">getDeviceId</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
deviceId <span class="token operator">=</span> <span class="token class-name">Settings</span><span class="token punctuation">.</span><span class="token class-name">Secure</span><span class="token punctuation">.</span><span class="token function">getString</span><span class="token punctuation">(</span>context<span class="token punctuation">.</span><span class="token function">getContentResolver</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token class-name">Settings</span><span class="token punctuation">.</span><span class="token class-name">Secure</span><span class="token punctuation">.</span>ANDROID_ID<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token class-name">Log</span><span class="token punctuation">.</span><span class="token function">d</span><span class="token punctuation">(</span><span class="token string">"deviceId"</span><span class="token punctuation">,</span> deviceId<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> deviceId<span class="token punctuation">;</span>

}

参考链接:
1.https://stackoverflow.com/questions/55173823/i-am-getting-imei-null-in-android-q
2.https://source.android.com/devices/tech/config/uicc

有些文章是从developer cp而来,怕一些同学没有梯子看不到,所以就直接粘贴了

最后

以上就是着急棉花糖为你收集整理的Android 10 使用getDeviceId()和getIMEI()的问题及方案问题背景:问题原因解决方案的全部内容,希望文章能够帮你解决Android 10 使用getDeviceId()和getIMEI()的问题及方案问题背景:问题原因解决方案所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部