Android设备有唯一的ID吗?如果有,使用Java访问它的简单方法是什么?
当前回答
这里有相当有用的信息。
它包括五种不同的ID类型:
IMEI(仅适用于使用手机的Android设备;需要Android.permission.READ_Phone_STATE)伪唯一ID(适用于所有Android设备)Android ID(可以为空,可以在工厂重置时更改,可以在根手机上更改)WLAN MAC地址字符串(需要android.permission.ACCESS_WIFI_STATE)BT MAC地址字符串(带蓝牙的设备,需要android.permission.蓝牙)
其他回答
Google实例ID
2015年I/O发布;在Android上需要播放服务7.5。
https://developers.google.com/instance-id/https://developers.google.com/instance-id/guides/android-implementation
InstanceID iid = InstanceID.getInstance( context ); // Google docs are wrong - this requires context
String id = iid.getId(); // blocking call
谷歌似乎打算使用这个ID来识别Android、Chrome和iOS的安装。
它标识的是安装而不是设备,但同样,ANDROID_ID(这是公认的答案)现在也不再标识设备。使用ARC运行时,会为每个安装生成一个新的ANDROID_ID(此处详细信息),就像这个新的实例ID一样。此外,我认为识别安装(而不是设备)是我们大多数人真正需要的。
实例ID的优点
在我看来,谷歌打算将其用于此目的(识别您的安装),它是跨平台的,可以用于许多其他目的(请参阅上面的链接)。
如果您使用GCM,那么您最终将需要使用此实例ID,因为您需要它来获取GCM令牌(它取代了旧的GCM注册ID)。
缺点/问题
在当前的实现(GPS 7.5)中,当应用程序请求实例ID时,会从服务器检索实例ID。这意味着上面的调用是一个阻塞调用-在我的非科学测试中,如果设备处于联机状态,则需要1-3秒,如果设备离线,则需要0.5-1.0秒(大概这是在放弃并生成随机ID之前等待的时间)。这是在北美使用Android 5.1.1和GPS 7.5在Nexus 5上测试的。
如果您将ID用于他们想要的目的,例如应用程序认证、应用程序识别、GCM,我认为这1-3秒可能会令人讨厌(当然,这取决于您的应用程序)。
Settings.Secure#ANDROID_ID返回每个用户64位十六进制字符串的唯一ANDROID ID。
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
通常,我的应用程序使用设备唯一id。但有时我会使用IMEI。两者都是唯一的数字。
获取IMEI(国际移动设备标识符)
public String getIMEI(Activity activity) {
TelephonyManager telephonyManager = (TelephonyManager) activity
.getSystemService(Context.TELEPHONY_SERVICE);
return telephonyManager.getDeviceId();
}
获取设备唯一id
public String getDeviceUniqueID(Activity activity){
String device_unique_id = Secure.getString(activity.getContentResolver(),
Secure.ANDROID_ID);
return device_unique_id;
}
IMEI怎么样。这对于Android或其他移动设备来说是独一无二的。
这是Reto Meier在今年的Google I/O演示中使用的代码,用于为用户获取唯一id:
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;
}
如果你将此与备份策略相结合,将首选项发送到云(Reto的演讲中也有描述),你应该有一个与用户相关的id,在设备被擦除甚至更换后,它会一直存在。我计划在未来的分析中使用此项(换句话说,我还没有做过这一点:)。
推荐文章
- Android:为什么视图没有maxHeight ?
- 如何获得具有已知资源名称的资源id ?
- 在Android上将字符串转换为整数
- 为什么“System.out。”println“工作在Android?
- WebView显示err_cleartext_not_allowed尽管站点是HTTPS
- Android M权限:对shouldShowRequestPermissionRationale()函数的使用感到困惑
- 为什么构建类型与产品风味不同?
- 我如何在一个片段中访问getSupportFragmentManager() ?
- 调试在哪里。Android Studio中的密钥存储库
- 从资产中读取文件
- 在不活动的地方调用getLayoutInflater()
- 设置Android布局元素的背景颜色
- 错误:'keytool'不能被识别为内部或外部命令、可操作程序或批处理文件
- 在应用程序本身中更改Locale
- apk (.apk)和应用程序包(.aab)的区别