几种获取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
- 几种获取Android手机唯一id的方法
- Android获取设备唯一ID的几种方式
- Android获取设备唯一ID的几种方式
- Android获取设备唯一ID的几种方式
- Android获取设备唯一ID的几种方式
- Android获取设备唯一ID的方法
- 获取设备唯一ID的几种方式
- Android获取手机输入法ID的方法
- 游戏服务器生成全局唯一ID的几种方法
- 生成全局唯一ID的几种方法
- Android多种方法获取唯一设备id
- 获取Android唯一ID
- 获取Android设备的唯一 Android ID
- Android 手机获取Mac地址的几种方法
- Android 开发中获取的设备id(每部手机的唯一标识)
- 获取android唯一ID 的坑
- Android设备唯一标识ID的获取
- 获取,制作手机的唯一的id号
- md5学习
- iOS开发中基础常用细节问题处理 - 1
- ubuntu学习--Idconfig
- springMVC3学习(十)--注解式控制器
- Android之WebRTC介绍
- 几种获取Android手机唯一id的方法
- 真机开启crash 日志
- Eclipse无法启动报An internal error occurred during: "reload maven project". java.lang.NullPointerExceptio
- unity手游<少侠历险记>(4)背包系统
- java解四元一次方程
- python调用存储过程,获取返回值
- Eclipse中打开java api源码的配置
- 【tyvj P1307】联络员
- Eclipse编译apk遇到SystemProperties无法识别解决方法