如何在 Android 10 中获取有关手机 IMEI 的信息?

Posted

技术标签:

【中文标题】如何在 Android 10 中获取有关手机 IMEI 的信息?【英文标题】:How do I get information about a phone's IMEI in Android 10? 【发布时间】:2020-01-30 12:02:33 【问题描述】:

android 10 之前,我使用 TelephonyManager API 来检索该信息,但它不再适用于 Android 10。

【问题讨论】:

I am getting IMEI null in Android Q?的可能重复 不再允许,因为 IMEI 是设备特定标识符,可用于向用户暴露各种隐私问题。你能告诉我们为什么你需要 IMEI,也许有推荐的替代品吗?有关该主题的参考,您可以查看developer.android.com/training/articles/user-data-ids Phony 加 1 :) IMEI 在 Android 10 中不再可访问,因为从 Google Play 商店安装的第三方应用程序无法声明特权权限。根据官方文档developer.android.com/about/versions/10/privacy/changes 【参考方案1】:

来自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.

【讨论】:

请考虑引用您复制和粘贴答案的位置。 (好像是从这里逐字复制粘贴的:developer.android.com/about/versions/10/privacy/…) 由于链接易断,最好以书面形式发布答案。【参考方案2】:

我也面临同样的问题,但就我而言,我有一种返回 UUID 的“备份”代码。 这是您可以使用的代码:

String uniqueID = UUID.randomUUID().toString();

如果您想要“安装唯一标识符”,此代码很有用,但它不能用作设备唯一标识符,因为如果用户卸载并重新安装您的应用程序,返回的 UUID 将与上一个不同。

在我的例子中,我使用 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

这里是同一个链接,但有一个锚点,其中谷歌描述了一些用例和每个用例的唯一标识符的最佳选择。 https://developer.android.com/training/articles/user-data-ids#common-use-cases

没有一个用例适合我,所以我仍在寻找更好的解决方案。

我希望这可以帮助某人。

【讨论】:

以上是关于如何在 Android 10 中获取有关手机 IMEI 的信息?的主要内容,如果未能解决你的问题,请参考以下文章

在 xmpp for android 中获取生日、性别、手机

Android:通过 IM 获取所有联系人

如何从 android 手机中获取已删除的联系人以及如何恢复它

Android之——获取手机安装的应用程序

Android能够获取到唯一的设备ID吗

如何获取有关手机版本和手机型号的信息? SwiftUI