在Android 10之前,我曾使用TelephonyManager
API来检索该信息,但在Android 10中不再起作用。
答案 0 :(得分:3)
从Android Developers Documentation Website
从Android 10开始,应用必须具有
READ_PRIVILEGED_PHONE_STATE
特权才能访问设备的不可重置标识符,包括IMEI和序列号。从Google Play商店安装的第三方应用无法声明特权。
如果您的应用没有权限,并且无论如何您都尝试询问有关不可重置标识符的信息,则平台的响应会根据目标SDK版本而有所不同:
- 如果您的应用定位到Android 10或更高版本,则会发生SecurityException。
- 如果您的应用定位到Android 9(API级别28)或更低版本,则如果该应用具有
READ_PHONE_STATE
权限,则该方法返回null或占位符数据。否则,将发生SecurityException。如果尝试访问它,它将引发以下异常:
java.lang.SecurityException: getImeiForSlot: The user 10180 does not meet the requirements to access device identifiers.
答案 1 :(得分:3)
我遇到了同样的问题,但是,就我而言,我有一种返回UUID的“备份”代码。 这是您可以使用的代码:
String uniqueID = UUID.randomUUID().toString();
如果您需要“安装唯一标识符”,则此代码很有用,但不能用作设备唯一标识符,因为如果用户取消安装并重新安装您的应用,则返回的UUID将不同于上一个。 / p>
在我的情况下,我使用UUID.nameUUIDFromBytes通过给定的“名称”生成UUID,并且我使用Settings.Secure.ANDROID_ID作为UUID的“名称”。使用此方法,您可以“保证”返回的UUID相同,除非用户进行了出厂重置。
代码如下:
String androidId = Settings.Secure.getString(context.getContentResolver(),
Settings.Secure.ANDROID_ID);
UUID androidId_UUID = UUID
.nameUUIDFromBytes(androidId.getBytes("utf8"));
String unique_id = androidId_UUID.toString();
直到这里,一切看起来都还可以,但是问题是:自从发布Android 10以来,Google不建议使用任何类型的“硬件标识符”,其中包括Settings.Secure.ANDROID_ID。这实际上是我的担心,因为在我所在的公司中,我们使用IMEI或此UUID来识别我们的客户用户,并定义用户是否尝试登录多个设备,这是我们的规则所不允许的,并建立一些静力学如果UUID在同一设备上不是唯一的,我们将必须检查所有用户访问控制。
此处是有关唯一标识符良好用法的Android开发人员链接。 https://developer.android.com/training/articles/user-data-ids
这里是相同的链接,但带有锚点,其中Google描述了一些用例以及每个情况的唯一标识符的最佳选择。 https://developer.android.com/training/articles/user-data-ids#common-use-cases
用例都不适合我,因此我仍在寻找更好的解决方案。
我希望这可以帮助某人。