是否存在唯一的Android设备ID?

19 浏览
0 Comments

是否存在唯一的Android设备ID?

Android设备是否拥有唯一的ID,如果是的话,用Java如何简单地访问它?

admin 更改状态以发布 2023年5月19日
0
0 Comments

更新:截至最近的Android版本,许多与ANDROID_ID有关的问题已经得到解决,我认为这种方法不再必要。请查看Anthony的答案

完全披露:我的应用程序最初使用下面的方法,但现在不再使用这种方法,我们现在使用Android Developer Blog中概述的方法,emmby的答案中提到(即生成和保存一个UUID#randomUUID())。


有许多关于此问题的答案,其中大部分只有“有时”有效,不幸的是,这还不够好。

根据我对设备进行的测试(所有手机都进行了测试,至少其中一个未激活)

  1. 所有测试的设备都返回TelephonyManager.getDeviceId()的值
  2. 所有GSM设备(所有测试都带有SIM卡)都返回TelephonyManager.getSimSerialNumber()的值
  3. 所有CDMA设备返回getSimSerialNumber()的null(如预期)
  4. 添加Google帐户的所有设备都返回ANDROID_ID的值
  5. 所有CDMA设备(只要在设置期间添加了谷歌帐户)都返回相同的值(或者相同值的派生值)ANDROID_IDTelephonyManager.getDeviceId()
  6. 我还没有测试无SIM卡的GSM设备、没有添加Google帐户的GSM设备或飞行模式下的任何设备。

因此,如果您想要一些独特的设备本身的内容,TM.getDeviceId()应该足够了。显然,一些用户比其他用户更偏执,因此对一个或多个这些标识符进行哈希处理可能是有用的,以便该字符串仍然对设备几乎是唯一的,但不明确地标识用户的实际设备。例如,使用String.hashCode()和UUID组合:

final TelephonyManager tm = (TelephonyManager) getBaseContext().getSystemService(Context.TELEPHONY_SERVICE);
final String tmDevice, tmSerial, androidId;
tmDevice = "" + tm.getDeviceId();
tmSerial = "" + tm.getSimSerialNumber();
androidId = "" + android.provider.Settings.Secure.getString(getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);
UUID deviceUuid = new UUID(androidId.hashCode(), ((long)tmDevice.hashCode() << 32) | tmSerial.hashCode());
String deviceId = deviceUuid.toString();

可能会得到类似如下的结果:00000000-54b3-e7c7-0000-000046bffd97

对我来说已经足够好了。

正如Richard在下面提到的,别忘了你需要读取TelephonyManager属性的许可,所以将其添加到你的清单中:


导入库

import android.content.Context;
import android.telephony.TelephonyManager;
import android.view.View;

0
0 Comments

Settings.Secure#ANDROID_ID 返回 Android ID,以 64 位十六进制字符串的形式作为每个用户的唯一标识符

import android.provider.Settings.Secure;
private String android_id = Secure.getString(getContext().getContentResolver(),
                                                        Secure.ANDROID_ID);

此外,还应阅读唯一标识符的最佳实践https://developer.android.com/training/articles/user-data-ids

0