一般都是用IMEI
获取方法
String imei =((TelephonyManager) context.getSystemService(TELEPHONY_SERVICE)).getDeviceId();
String IMEI =android.os.SystemProperties.get(android.telephony.TelephonyProperties.PROPERTY_IMEI);
Android6.0之前是没有任何问题的,除非一些山寨手机厂商没有给手机写入imei。但是如果碰到在Android6.0的设备上时,就需要动态去申请获取imei,但我感觉很多用户会拒绝。在没有imei的山寨机上这个方法也就行不通了。所以就需要下面几种方式(这里说到的都是可靠能用的)。
String m_szDevIDShort = "35" +
Build.BOARD.length() % 10 + Build.BRAND.length() % 10 +
Build.CPU_ABI.length() % 10 + Build.DEVICE.length() % 10 +
Build.DISPLAY.length() % 10 + Build.HOST.length() % 10 +
Build.ID.length() % 10 + Build.MANUFACTURER.length() % 10 +
Build.MODEL.length() % 10 + Build.PRODUCT.length() % 10 +
Build.TAGS.length() % 10 + Build.TYPE.length() % 10 +
Build.USER.length() % 10; //13 位
这样获取到的是一串几乎和imei类似的15位数字的串,满足大多数需求,前面的35你可以随意修改一个两位数。
2.
public static String getSimSerialNumber() {
return ((TelephonyManager)AppXiKang.getApp().getSystemService(
Context.TELEPHONY_SERVICE)).getSimSerialNumber();
}
public static String getSerialNumber1() {
returnandroid.os.Build.SERIAL;
}
/**
* getSerialNumber
* @return result is same to getSerialNumber1()
*/
public static String getSerialNumber(){
String serial = null;
try {
Class> c =Class.forName("android.os.SystemProperties");
Method get =c.getMethod("get", String.class);
serial = (String)get.invoke(c, "ro.serialno");
} catch (Exception e) {
e.printStackTrace();
}
return serial;
}
比较稳定的设备硬件标识符,上面第三个方法也适用于反射获取其他系统参数,需要不同的key
3.
public static String getUniquePsuedoID() {
String serial = null;
String m_szDevIDShort = "35" +
Build.BOARD.length() % 10 + Build.BRAND.length() % 10 +
Build.CPU_ABI.length() % 10 + Build.DEVICE.length() % 10 +
Build.DISPLAY.length() % 10 + Build.HOST.length() % 10 +
Build.ID.length() % 10 + Build.MANUFACTURER.length() % 10 +
Build.MODEL.length() % 10 + Build.PRODUCT.length() % 10 +
Build.TAGS.length() % 10 + Build.TYPE.length() % 10 +
Build.USER.length() % 10; //13 位
try {
serial = android.os.Build.class.getField("SERIAL").get(null).toString();
//API>=9 使用serial号
return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
} catch (Exception exception) {
//rial需要一个初始化
serial = "serial"; // 随便一个初始化
}
//使用硬件信息拼凑出来的15位号码
return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
}
最终会得到这样的一串ID:00000000-28ee-3eab-ffff-ffffe9374e72
如果服务端对长度没啥要求,这样的也就可以了,但我们的需要在30位以下
4.
public static String getUniquePsuedoID() {
String serial = null;
String m_szDevIDShort = "35" +
Build.BOARD.length() % 10 + Build.BRAND.length() % 10 +
Build.CPU_ABI.length() % 10 + Build.DEVICE.length() % 10 +
Build.DISPLAY.length() % 10 + Build.HOST.length() % 10 +
Build.ID.length() % 10 + Build.MANUFACTURER.length() % 10 +
Build.MODEL.length() % 10 + Build.PRODUCT.length() % 10 +
Build.TAGS.length() % 10 + Build.TYPE.length() % 10 +
Build.USER.length() % 10; //13 位
try {
serial = android.os.Build.class.getField("SERIAL").get(null).toString();
//API>=9 使用serial号
return Md5(new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString());
} catch (Exception exception) {
//rial需要一个初始化
serial = "serial"; // 随便一个初始化
}
return Md5(new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString());
}
//md5加密
public static String Md5(String sourceStr) {
String result = "";
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(sourceStr.getBytes());
byte b[] = md.digest();
int i; StringBuffer buf = new StringBuffer("");
for (int offset = 0; offset < b.length; offset++) {
i = b[offset];
if(i<0)
i+= 256;
if(i<16)
buf.append("0");
buf.append(Integer.toHexString(i));
}
result = buf.toString().substring(8,24);
System.out.println("result: " + result);//32位的加密
// System.out.println("result: " + buf.toString().substring(8,24));//16位的加密
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block e.printStackTrace();
}
return result;
}
这里也就只是把在3里面获取到的值做了个md5的16位加密。(大家可以不用写成这样,直接md5(getUniquePsuedoID()))。
其实也就是不同硬件信息拼凑,类似的还有
UUID deviceUuid = new UUID(androidId.hashCode(), ((long)deviceId.hashCode() << 32) | simSerialNum.hashCode());
String deviceId = deviceUuid.toString();
当然上面的你也可以用MD5加密,至于位数,按需选择。有关于其他的硬件信息介绍可以查看我参考的文章
http://www.loyea.com/?p=350
http://blog.csdn.net/nugongahou110/article/details/47003257
至于6.0的权限问题,这个case用到的就只有checkpermission,不需要去主动申请。具体权限处理就不多提了,大家自行搜索。