【问题标题】:Is Secure.ANDROID_ID unique for each device?每个设备的 Secure.ANDROID_ID 是否唯一?
【发布时间】:2011-06-15 12:35:17
【问题描述】:

我正在使用这个电话:

Secure.getString(getApplicationContext().getContentResolver(), Secure.ANDROID_ID);

获取设备的 UID。我想我从多个设备获得了相同的 ID。这应该可能吗?

有问题的 ID 是:9774d56d682e549c,显然有多个设备返回此 ID http://code.google.com/p/android/issues/list?cursor=10603&updated=10603&ts=1295993403 存在问题

【问题讨论】:

  • 在查找有问题的 ID 并看到有关它的线程后,我确定。起初我认为设备可能返回 null 并且我已将其作为默认值放在某处。但这种情况并非如此。我确信我在多个设备上获得了相同的价值。
  • 对于不是唯一的情况,使用this library,它带有Identity.getDeviceId(context)

标签: android uuid uniqueidentifier


【解决方案1】:

查看此thread,。但是,您应该小心,因为它被记录为“可以在出厂重置时更改”。使用风险自负,并且可以在有根手机上轻松更改。此外,似乎有些制造商的手机号码重复thread 存在问题。根据您的尝试,我可能不会将其用作 UID。

【讨论】:

  • 很遗憾,ANDROID_ID 的实现是如此...蹩脚!从 Google 的文档来看,意图是一个更持久的 ID:A 64-bit number (as a hex string) that is randomly generated on the device's first boot and should remain constant for the lifetime of the device
  • 根据该线程link “此外,在主要制造商的流行手机中至少存在一个被广泛观察的错误,其中每个实例都具有相同的 ANDROID_ID。” 最好不要使用它
  • 那是 2011 年 Froyo 期间的事。现在已经无关紧要了。
  • 设备备份/恢复或设备克隆怎么样?关于拥有相同 ANDROID_ID 的机会的任何想法?当然,假设设备没有植根。
【解决方案2】:

在 Android O 中,ANDROID_ID 的行为会发生变化。手机上每个用户的每个应用程序的 ANDROID_ID 都会有所不同。

取自:https://android-developers.googleblog.com/2017/04/changes-to-device-identifiers-in.html

Android ID

在 O 中,Android ID(Settings.Secure.ANDROID_ID 或 SSAID)对于设备上的每个应用和每个用户都有不同的值。需要设备范围标识符的开发人员应改为使用可重置的标识符,例如广告 ID,从而为用户提供更多控制权。广告 ID 还提供了面向用户的设置来限制广告跟踪。

另外在 Android O 中:

  • ANDROID_ID 值在软件包卸载/重新安装时不会改变,因为 只要包名称和签名密钥相同。应用程序可以依赖 在此值上以在重新安装时保持状态。
  • 如果应用程序安装在运行早期版本的设备上 Android,Android ID 保持不变 更新到 Android O,除非应用程序被卸载并且 重新安装。
  • Android ID 值仅在设备出厂时才会更改 重置或签名密钥在卸载和
    之间轮换 重新安装事件。
  • 只有设备制造商需要此更改 随附 Google Play 服务和广告 ID。其他 设备制造商可能会提供另一种可重置的 ID 或继续提供 ANDROID ID。

【讨论】:

  • 谢谢。我正在努力弄清楚为什么我没有使用 Device ID 报告的 (md5'ed) ID 在妻子的手机中获得测试广告,然后为什么这与通过 adb shell settings 命令报告的值不匹配。 ..我以为我要疯了。
【解决方案3】:

因此,如果您想要设备本身独有的东西,TM.getDeviceId() 应该就足够了。

这是显示如何获取电话经理 ID 的代码。您使用的 android 设备 ID 可以在出厂设置中更改,并且某些制造商在提供唯一 ID 时存在问题。

TelephonyManager tm = 
        (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
String androidId = Secure.getString(this.getContentResolver(), Secure.ANDROID_ID);
Log.d("ID", "Android ID: " + androidId);
Log.d("ID", "Device ID : " + tm.getDeviceId());

请务必通过使用获取TelephonyManager 的权限

<uses-permission android:name="android.permission.READ_PHONE_STATE" />

【讨论】:

  • 是的,使用 getDeviceId() 也可以。但是你应该非常小心,因为它可能会返回 null。 (在没有 3g/电话调制解调器的设备上)我使用的解决方案是使用 Wifi 的 MAC 地址(当然也可能丢失,但通常不在同一设备上)
  • 要求READ_PHONE_STATE 权限太糟糕了。请改用ANDROID_ID
  • 是的,它可能会在没有 3g 的设备上返回 null(市场上有很多),那么您应该使用 WiFi - 它的 guid 也可能为 null,直到您至少打开/关闭一次之后设备重启。如果没有 wifi……真是噩梦,在 windows ce 上,每个设备都有 GUID,生活很美好。
  • 经过数千次请求后发现,设备 ID (即 IMEI)可以在假设备上复制,因此不是一个完整的证明解决方案。我正在恢复使用 getSimSerialNumber 和 ANDROID_ID 作为后备。
  • Android 10(API 级别 29)增加了对不可重置标识符的限制,其中包括 IMEI 和序列号。在实施 TM.getDeviceId() 方法之前,请先查看 new permission requirements 以获取 Android >=10 设备上的设备标识符。
【解决方案4】:

存在多种解决方案,但没有一个是完美的。让我们一个一个去。

1. Unique Telephony Number (IMEI, MEID, ESN, IMSI)

  • 此解决方案需要请求 android.permission.READ_PHONE_STATE 给您的用户,这可能很难 按照您提出的申请类型证明其合理性。

  • 此外,此解决方案仅限于智能手机,因为平板电脑 没有电话服务。一个优点是该值在设备上恢复出厂设置后仍然有效。

2. MAC Address

  • 您还可以尝试从具有 Wi-Fi 或 蓝牙硬件。但是,不建议使用此解决方案,因为不是 所有设备都有 Wi-Fi 连接。即使用户有 Wi-Fi 连接,必须打开才能检索数据。 否则,调用不会报告 MAC 地址。

3. Serial Number

  • 没有电话服务的设备(如平板电脑)必须报告一个唯一的设备 ID,该 ID 自 Android 2.3 Gingerbread 起可通过 android.os.Build.SERIAL 获得。一些具有电话服务的电话也可以定义一个序列号。与并非所有 Android 设备都有序列号一样,此解决方案并不可靠。

4. Secure Android ID

  • 在设备首次启动时,会生成并存储一个随机值。该值可通过 Settings.Secure.ANDROID_ID 获得。这是一个 64 位的数字,在设备的整个生命周期内应该保持不变。 ANDROID_ID 似乎是唯一设备标识符的不错选择,因为它适用于智能手机和平板电脑。

    String androidId = Settings.Secure.getString(getContentResolver(),Settings.Secure.ANDROID_ID);
    
  • 但是,如果在设备上执行恢复出厂设置,该值可能会发生变化 设备。一个流行的手机也有一个已知的错误 每个实例都具有相同 ANDROID_ID 的制造商。清楚地, 该解决方案并非 100% 可靠。

5. Use UUID

  • 由于大多数应用程序的要求是确定一个 特定的安装,而不是物理设备,一个很好的解决方案 如果使用 UUID 类,则获取用户的唯一 ID。下列 Google 的 Reto Meier 在 Google I/O 上提出了解决方案 介绍:

    private static String uniqueID = null;
    private static final String PREF_UNIQUE_ID = "PREF_UNIQUE_ID";
    public synchronized static String id(Context context) {
       if (uniqueID == null) {
           SharedPreferences sharedPrefs = context.getSharedPreferences(
                   PREF_UNIQUE_ID, Context.MODE_PRIVATE);
           uniqueID = sharedPrefs.getString(PREF_UNIQUE_ID, null);
           if (uniqueID == null) {
               uniqueID = UUID.randomUUID().toString();
               Editor editor = sharedPrefs.edit();
               editor.putString(PREF_UNIQUE_ID, uniqueID);
               editor.commit();
           }
       }    return uniqueID;
    }
    

在 Android 上识别特定设备并非易事。有很多很好的理由可以避免这种情况。最好的解决方案可能是使用 UUID 解决方案来识别特定的安装。 信用:blog

【讨论】:

    【解决方案5】:

    我已经阅读了一些关于此的内容,不幸的是,不应依赖 ANDROID_ID 来唯一标识单个设备。

    Android 合规性要求中似乎没有强制执行它,因此制造商似乎按照他们选择的方式实施它,包括一些更多地将其用作“模型”ID 等。

    另外,请注意,即使制造商编写了生成器以使其成为 UUID(例如),也不能保证恢复出厂设置。

    【讨论】:

    • 我认为它保证不会在设计上恢复出厂设置,它在文档中的某处提到。这是实现它的正确方法。
    • 那么我们如何生成 GUID?
    【解决方案6】:

    只需在此处列出一个替代解决方案,即广告 ID:

    https://support.google.com/googleplay/android-developer/answer/6048248?hl=en

    从上面的链接复制:

    广告 ID 是由 Google Play 服务提供的唯一的、用户可重置的广告 ID。它为用户提供了更好的控制,并为开发人员提供了一个简单的标准系统,以继续通过他们的应用程序获利。它使用户能够在 Google Play 应用中重置其标识符或选择退出个性化广告(以前称为基于兴趣的广告)。

    限制是:

    1. 仅限支持 Google Play 的设备。
    2. 隐私政策:https://support.google.com/googleplay/android-developer/answer/113469?hl=en&amp;rd=1#privacy

    【讨论】:

    • 这是否适用于没有 Google Play(服务)的手机?
    • 这不是 GUID
    【解决方案7】:
    //Fields
    String myID;
    int myversion = 0;
    
    
    myversion = Integer.valueOf(android.os.Build.VERSION.SDK);
    if (myversion < 23) {
            TelephonyManager mngr = (TelephonyManager) 
    getSystemService(Context.TELEPHONY_SERVICE);
            myID= mngr.getDeviceId();
        }
        else
        {
            myID = 
    Settings.Secure.getString(getApplicationContext().getContentResolver(), 
    Settings.Secure.ANDROID_ID);
        }
    

    是的,Secure.ANDROID_ID 对于每台设备都是唯一的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-13
      • 2013-10-12
      • 2011-10-19
      • 1970-01-01
      • 2015-01-30
      • 2011-01-21
      • 1970-01-01
      • 2016-11-16
      相关资源
      最近更新 更多