我正在使用此电话:
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
时出现问题答案 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中:
答案 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
3. Serial Number
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应用中的个性化广告(以前称为基于兴趣的广告)。
限制是:
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对于每个设备都是唯一的。