权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
测试设备:
小米pad2,HTCd816t(有卡),华为4c(无卡),vivo X6L(无卡)
1.IMEI
IMEI(International Mobile Equipment Identity,移动设备国际识别码,又称为国际移动设备标识)是手机的唯一识别号码。
IMEI针对手机(有没有手机卡都能获取),pad上不适用,亲测小米pad返回null
(根据通信制式不同,可能是IMEI,MEID,ESN)
代码:
/**
Returns the unique device ID, for example, the IMEI for GSM and the MEID or ESN for CDMA phones. Return null if device ID is not available.
*/
private String getIMEI() {
TelephonyManager telephonyManager = (TelephonyManager) this
.getSystemService(Context.TELEPHONY_SERVICE);
String IMEI = telephonyManager.getDeviceId();
return IMEI;
}
2.ANDROID_ID
16进制的64位字符,恢复出厂设置时,此值可能改变(官方文档有注释,如下)
获取方式:
/**
A 64-bit number (as a hex string) that is randomly
generated when the user first sets up the device and should remain
constant for the lifetime of the user's device. The value may
change if a factory reset is performed on the device.
*/
private String getAndroidId(){
return Settings.Secure.getString(this.getContentResolver(), Settings.Secure.ANDROID_ID);
}
3.IMSI
国际移动用户识别码(IMSI:International Mobile Subscriber Identification Number)是区别移动用户的标志
没有手机卡返回null
手机卡手机通讯的唯一标识
获取方法:
private String getIMSI() {
TelephonyManager telephonyManager = (TelephonyManager) this
.getSystemService(Context.TELEPHONY_SERVICE);
String IMSI = telephonyManager.getSubscriberId();
return IMSI;
}
4.序列号
android手机和pad都可以获取
String SerialNumber = android.os.Build.SERIAL;
或者
public String getSerialNum() {
try {
Class localClass = Class.forName("android.os.SystemProperties");
String str = (String) localClass.getMethod("get", new Class[]{String.class, String.class}).invoke(localClass, new Object[]{"ro.serialno", "unknown"});
return str;
} catch (Exception localException) {
}
return null;
}
5.MAC地址
不建议作为唯一标示
有些手机不root进入手机工程模式可以临时修改mac地址的值,重启之后可以恢复正常,亲测vivo X6L手机可以修改.
获取方法:
private String getMac() {
String macSerial = null;
String str = "";
try {
Process pp = Runtime.getRuntime().exec("cat /sys/class/net/wlan0/address ");
InputStreamReader ir = new InputStreamReader(pp.getInputStream());
LineNumberReader input = new LineNumberReader(ir);
for (; null != str; ) {
str = input.readLine();
if (str != null) {
macSerial = str.trim();// 去空格
break;
}
}
} catch (IOException ex) {
// 赋予默认值
ex.printStackTrace();
}
return macSerial;
}
总结:
可以使用1,4作为android设备的唯一标识,也可以结合两种值组合生成唯一标识。