几种获取Android手机唯一id的方法

一般都是用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的山寨机上这个方法也就行不通了。所以就需要下面几种方式(这里说到的都是可靠能用的)。

    1.
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,不需要去主动申请。具体权限处理就不多提了,大家自行搜索。

你可能感兴趣的:(android应用)