概述
应用升级了targetSDKVersion 到api 29,也就是Android 10,之前一些应用内用到 AndroidRuntime: FATAL EXCEPTION: Thread-4326 我猜测和小米的room有关,在这先不进一步讨论了 从 Android 10 开始,应用必须具有 READ_PRIVILEGED_PHONE_STATE 特许权限才能访问设备的不可重置标识符(包含 IMEI 和序列号)。 注意:从 Google Play 商店安装的第三方应用无法声明特许权限。 受影响的方法包括: 如果您的应用没有该权限,但您仍尝试查询不可重置标识符的相关信息,则平台的响应会因目标 SDK 版本而异: 注意:如果您的应用是设备所有者或资料所有者应用,那么即使您的应用以 Android 10 或更高版本为目标平台,您也只需 许多使用场景都不需要不可重置的设备标识符。例如,如果您的应用将不可重置的设备标识符用于广告跟踪或用户分析目的,请为这些特定使用场景使用 Android 广告 ID。要了解详情,请参阅唯一标识符的最佳做法。 具体可以参考这篇文章:android 10 的隐私权和位置信息 代码:问题背景:
getDeviceId
和getIMEI
就出了问题,但是调用这些api的时候,都进行了try catch,但是在小米9手机上还是会崩溃:
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.ITelephonyProxy.getDeviceId(ITelephony.java:10389)
E AndroidRuntime: at android.telephony.TelephonyManager.getDeviceId(TelephonyManager.java:1629)问题原因
Build
getSerial()
TelephonyManager
getImei()
getDeviceId()
getMeid()
getSimSerialNumber()
getSubscriberId()
SecurityException
。null
或占位符数据(如果应用具有 READ_PHONE_STATE
权限)。否则,会发生 SecurityException
。READ_PHONE_STATE
权限即可访问不可重置的设备标识符。此外,如果您的应用具有特殊运营商权限,则无需任何权限即可访问这些标识符。解决方案
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">>=</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">>=</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">>=</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()的问题及方案问题背景:问题原因解决方案所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复