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

时间:2011-01-25 22:06:00

标签: android uuid uniqueidentifier

我正在使用此电话:

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

时出现问题

7 个答案:

答案 0 :(得分:32)

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

答案 1 :(得分:22)

使用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。

答案 2 :(得分:14)

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

以下是显示如何获取Telephony manager 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" />

答案 3 :(得分:6)

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

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

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

答案 4 :(得分:6)

存在多种解决方案,但都不完美。我们一个一个地走。

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 :(得分:1)

在此处列出一个替代解决方案,即广告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&rd=1#privacy

答案 6 :(得分:0)

//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对于每个设备都是唯一的。