【发布时间】:2020-03-22 17:11:10
【问题描述】:
对于特殊的自助服务终端设置,我需要设备的 IMEI。自 Android 10 起,常规应用无法访问 IMEI 等设备标识符。但是documentation 建议:
此 API 需要以下条件之一:
- 如果调用者是设备或配置文件所有者,则调用者拥有 Manifest.permission#READ_PHONE_STATE 权限。
- ...
我已使用以下命令将应用设置为设备所有者:
adb shell dpm set-device-owner com.xxxx.xxxx/.AdminReceiver
我的清单包含:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
使用以下代码行访问 IMEI:
TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
try
{
return telephonyManager.getImei();
}
catch (SecurityException e)
{
return null;
}
我仍然收到 SecurityExceptions(带有消息:The user does not meet the requirements to access device identifiers.)。我做错了什么?
【问题讨论】:
-
我认为
READ_PHONE_STATE是dangerouspermission that needs to be requested at runtime。除此之外,您可能会考虑记录异常并检查其消息以获取更多详细信息。 -
我在 Android 10 上遇到了完全相同的问题。感谢 ADB,我的应用程序被设置为设备所有者,并且在运行时请求了良好的权限,就像您编写 @CommonsWare 时一样。我检查了设置应用程序。但我仍然有相同的SecurityException。自 2020 年 7 月以来,此解决方案是否明确被阻止,如以下答案中提到的 vmayorow ?如果您有IMEI的想法,请提供帮助。谢谢
-
@odgatelmand:文档没有改变,所以我的假设是 dan 使用的配方应该有效。但是,我个人并没有尝试过以这种方式访问 IMEI——我的回答是基于 dan 根据我的原始评论所做的工作。
-
感谢您的快速回复。我刚刚在其他装有 Android 10 的设备上尝试过,似乎在某些版本的 Android 10 上,没有返回 IMEI,正如@vmayorow 下面提到的那样
-
作为设备所有者应用程序,您可以通过编程方式授予危险权限:setPermissionGrantState。此外,我同意即使您已正确完成所有操作,某些设备仍然不提供 imei。
标签: android