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

时间:2019-10-01 08:16:26

标签: android android-permissions telephonymanager imei

在Android 10之前,我曾使用TelephonyManager API来检索该信息,但在Android 10中不再起作用。

2 个答案:

答案 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

用例都不适合我,因此我仍在寻找更好的解决方案。

我希望这可以帮助某人。