我刚好做过这方面的研究,直接拿我之前做过的笔记了,欢迎关注、采纳、持续交流Andorid问题
一共有 五大方法:(推荐第五种)
1.设备ID(DEVICE_ID)
Android系统为开发者提供的用于标识手机设备的标识码。它会根据不同的手机设备返回IMEI,MEID或者ESN码(IMEI是手机的身份证,MEID是CDMA制式(电信运营的)的专用身份证;IMEI是15位,MEID是14位)。
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
String DEVICE_ID =tm.getDeviceId();
没有通话的硬件功能,无法获得DEVICE_ID。
需要READ_PHONE_STATE权限,部分用户会怀疑软件的安全性。
(Android 6.0 以上需要用户手动赋予该权限)
厂商定制系统中的Bug,可能是一串0或者一串*号。
2. SIM卡序列号
不同SIM卡的序列号不同
TelephonyManager tm = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
String simSerialNum = tm.getSimSerialNumber();
手机未装SIM卡或者不可用时,返回 null.
也需要 READ_PHONE_STATE 权限。
3. 设备序列号(SERIAL)
String serialNum = android.os.Build.SERIAL;
所有的CDMA 设备对于却返回一个空值
Android系统2.3版本以上
4. ANDROID_ID
在设备首次启动时,系统会随机生成一个64位的数字,并把这个数字以16进制字符串的形式保存下来,这个16进制的字符串就是ANDROID_ID,当设备被wipe后该值会被重置。
String ANDROID_ID = System.getString(getContentResolver(), Settings.System.ANDROID_ID);
定制系统的Bug:不同的设备可能会产生相同的,有些设备返回的值为null。
在 Android 4.2 及以上, 设备启用多用户功能后,每个用户的 Android_ID 不相同。
部分设备的ANDROID_ID和TelephonyManager.getDeviceId()返回相同的值
5. 自定义UUID(本人推荐)
public class Installation {
private static String sID = null;
private static final String INSTALLATION = "INSTALLATION";
public synchronized static String id(Context context) {
if (sID == null) {
File installation = new File(context.getFilesDir(), INSTALLATION);
try {
if (!installation.exists()) writeInstallationFile(installation);
sID = readInstallationFile(installation);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
return sID;
}
private static String readInstallationFile(File installation) throws IOException {
RandomAccessFile f = new RandomAccessFile(installation, "r");
byte[] bytes = new byte[(int) f.length()];
f.readFully(bytes);
f.close();
return new String(bytes);
}
private static void writeInstallationFile(File installation) throws IOException {
FileOutputStream out = new FileOutputStream(installation);
String id = UUID.randomUUID().toString();
out.write(id.getBytes());
out.close();
}
}