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

来源:互联网 发布:大数据分析软件有哪些 编辑:程序博客网 时间:2024/06/11 02:44

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

0 0
原创粉丝点击