以下是一种比较靠谱的解决方案。通过获取到 IMEI、AndroidId、macAddress 进行拼接,再将拼接结果进行 MD5 转换,那么就可以得到一串 32 个字符的 16 进制数据,这时候也能够保证得到的设备唯一标识为统一的长度。这样也能够很大程度上保证你最终得到的唯一标识不为空,因为这三个值同时为空几乎不大可能。
public static String generateUniqueDeviceId(){
Context context = MyApplication.getInstance();
String imei = "";
String androidId = "";
String macAddress = "";
TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(TELEPHONY_SERVICE);
if (telephonyManager != null) {
imei = telephonyManager.getDeviceId();
}
ContentResolver contentResolver = context.getContentResolver();
if (contentResolver != null) {
androidId = Settings.Secure.getString(contentResolver, Settings.Secure.ANDROID_ID);
}
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
if (wifiManager != null) {
macAddress = wifiManager.getConnectionInfo().getMacAddress();
}
StringBuilder longIdBuilder = new StringBuilder();
if (imei != null) {
longIdBuilder.append(imei);
}
if (androidId != null) {
longIdBuilder.append(androidId);
}
if (macAddress != null) {
longIdBuilder.append(macAddress);
}
return MD5Utils.toMd5(longIdBuilder.toString());
}
获取 IMEI 需要加入权限 android.permission.READ_PHONE_STATE
获取 macAddress 需要加入权限 android.permission.ACCESS_WIFI_STATE