Secure.ANDROID_ID对每个设备都是唯一的吗?

Foa*_*Guy 65 uuid android uniqueidentifier

我正在使用这个电话:

Secure.getString(getApplicationContext().getContentResolver(), Secure.ANDROID_ID);
Run Code Online (Sandbox Code Playgroud)

获取设备的UID.我想我从多个设备获得相同的ID.这有可能吗?

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

nin*_*nse 34

检查这个帖子,.但是你应该小心,因为它被记录为"可以在恢复出厂设置时更改".使用风险自负,可以在root手机上轻松更改.此外,似乎一些制造商的手机有重复数字线程的问题.根据您的尝试,我可能不会将其用作UID.

  • 令人遗憾的是,ANDROID_ID的实施是如此......蹩脚!从谷歌的文档来看,意图是一个持久的ID:一个64位的数字(作为一个十六进制字符串),它是在设备首次启动时随机生成的,应该在设备的生命周期内保持不变. (15认同)
  • 根据此主题[link](http://android-developers.blogspot.in/2011/03/identifying-app-installations.html)**“此外,在一个流行的程序中,至少存在一个广为人知的错误主要制造商的手机,每个实例都具有相同的ANDROID_ID。“ ** **最好不要使用** (3认同)
  • 那是从 2011 年的 Froyo 开始的。现在已经无关紧要了。 (2认同)

use*_*372 29

使用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 O时,Android ID将保持不变,除非卸载并重新安装该应用程序.
  • 如果设备出厂重置或者签名密钥在卸载和
    重新安装事件之间轮换,则Android ID值仅会更改.
  • 只有使用Google Play服务和广告ID的设备制造商才需要进行此更改.其他设备制造商可能会提供替代的可重置ID或继续提供ANDROID ID.


Vin*_*kal 15

所以,如果你想要独一无二的设备本身的东西,TM.getDeviceId() 应该是足够的.

以下是显示如何获取Telephony管理员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());
Run Code Online (Sandbox Code Playgroud)

一定要采取权限TelephonyManager使用

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
Run Code Online (Sandbox Code Playgroud)

  • 要求"READ_PHONE_STATE"权限很糟糕.请改用"ANDROID_ID". (16认同)
  • 是的,使用getDeviceId()也可以.但是你应该非常小心,因为它可能会返回null.(在没有3g /手机调制解调器的设备上)我使用的解决方案是回退到Wifi的mac-address(当然也可能丢失,但通常不在同一台设备上) (3认同)

Rad*_*hey 9

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

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

  • 此解决方案需要向您的用户请求 android.permission.READ_PHONE_STATE,这可能很难根据您制作的应用程序类型来证明。

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

2. MAC Address

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

3. Serial Number

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

4. Secure Android ID

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

    String androidId = Settings.Secure.getString(getContentResolver(),Settings.Secure.ANDROID_ID);
    
    Run Code Online (Sandbox Code Playgroud)
  • 但是,如果在设备上执行恢复出厂设置,该值可能会更改。制造商的流行手机也存在一个已知错误,其中每个实例都具有相同的 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;
    }
    
    Run Code Online (Sandbox Code Playgroud)

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


Squ*_*onk 6

我已经阅读了一些关于此的内容,遗憾的是,不应该依赖ANDROID_ID来唯一地识别单个设备.

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

另外,请注意,即使制造商已经编写了一个生成器来使其成为UUID(例如),也不能保证在出厂重置后仍然存在.

  • 我认为保证不会因设计而无法恢复出厂设置,而是在文档中的某处提到过.这是实施它的正确方法. (5认同)