1。(唯一)不重复类:

package com.xxx.xxx.util;import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Build;
import android.provider.Settings;
import android.telephony.TelephonyManager;import java.security.MessageDigest;
import java.util.Locale;
import java.util.UUID;public class DeviceIdUtil {/*** 获得设备硬件标识** @param context 上下文* @return 设备硬件标识*/public static String getDeviceId(Context context) {StringBuilder sbDeviceId = new StringBuilder();//获得设备默认IMEI(>=6.0 需要ReadPhoneState权限)String imei = getIMEI(context);//获得AndroidId(无需权限)String androidid = getAndroidId(context);//获得设备序列号(无需权限)String serial = getSERIAL();//获得硬件uuid(根据硬件相关属性,生成uuid)(无需权限)String uuid = getDeviceUUID().replace("-", "");//追加imeiif (imei != null && imei.length() > 0) {sbDeviceId.append(imei);sbDeviceId.append("|");}//追加androididif (androidid != null && androidid.length() > 0) {sbDeviceId.append(androidid);sbDeviceId.append("|");}//追加serialif (serial != null && serial.length() > 0) {sbDeviceId.append(serial);sbDeviceId.append("|");}//追加硬件uuidif (uuid != null && uuid.length() > 0) {sbDeviceId.append(uuid);}//生成SHA1,统一DeviceId长度if (sbDeviceId.length() > 0) {try {byte[] hash = getHashByString(sbDeviceId.toString());String sha1 = bytesToHex(hash);if (sha1 != null && sha1.length() > 0) {//返回最终的DeviceIdreturn sha1;}} catch (Exception ex) {ex.printStackTrace();}}//如果以上硬件标识数据均无法获得,//则DeviceId默认使用系统随机数,这样保证DeviceId不为空return UUID.randomUUID().toString().replace("-", "");}//需要获得READ_PHONE_STATE权限,>=6.0,默认返回null@SuppressLint("MissingPermission")private static String getIMEI(Context context) {try {TelephonyManager tm = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);return tm.getDeviceId();} catch (Exception ex) {ex.printStackTrace();}return "";}/*** 获得设备的AndroidId** @param context 上下文* @return 设备的AndroidId*/private static String getAndroidId(Context context) {try {return Settings.Secure.getString(context.getContentResolver(),Settings.Secure.ANDROID_ID);} catch (Exception ex) {ex.printStackTrace();}return "";}/*** 获得设备序列号(如:WTK7N16923005607), 个别设备无法获取** @return 设备序列号*/private static String getSERIAL() {try {return Build.SERIAL;} catch (Exception ex) {ex.printStackTrace();}return "";}/*** 获得设备硬件uuid* 使用硬件信息,计算出一个随机数** @return 设备硬件uuid*/private static String getDeviceUUID() {try {String dev = "3883756" +Build.BOARD.length() % 10 +Build.BRAND.length() % 10 +Build.DEVICE.length() % 10 +Build.HARDWARE.length() % 10 +Build.ID.length() % 10 +Build.MODEL.length() % 10 +Build.PRODUCT.length() % 10 +Build.SERIAL.length() % 10;return new UUID(dev.hashCode(),Build.SERIAL.hashCode()).toString();} catch (Exception ex) {ex.printStackTrace();return "";}}/*** 取SHA1* @param data 数据* @return 对应的hash值*/private static byte[] getHashByString(String data){try{MessageDigest messageDigest = MessageDigest.getInstance("SHA1");messageDigest.reset();messageDigest.update(data.getBytes("UTF-8"));return messageDigest.digest();} catch (Exception e){return "".getBytes();}}/*** 转16进制字符串* @param data 数据* @return 16进制字符串*/private static String bytesToHex(byte[] data){StringBuilder sb = new StringBuilder();String stmp;for (int n = 0; n < data.length; n++){stmp = (Integer.toHexString(data[n] & 0xFF));if (stmp.length() == 1)sb.append("0");sb.append(stmp);}return sb.toString().toUpperCase(Locale.CHINA);}
}

2.(不唯一)之前使用,但是在是红米的时候,出现重复:

    /*** 获得独一无二的Psuedo ID=>会重复(红米 Redmi 8A)==》使用 DeviceIdUtil* @return*/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 = Build.class.getField("SERIAL").get(null).toString();//API>=9 使用serial号return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();} catch (Exception exception) {//serial需要一个初始化serial = "serial"; // 随便一个初始化}//使用硬件信息拼凑出来的15位号码return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();}

3.(唯一)如果有集成极光,可以使用极光的

Registration Id  使用极光设备id

4.使用1和2的比较结果:所以在没有极光的情况下使用1。在有极光的情况下,如果极光设备Id不为空则用极光设备id,否者使用1方法。

        String device= Tools.getUniquePsuedoID();LogUitl.e("=================de:"+device);//  红米(blue) :00000000-3cfe-a96a-ffff-ffffef05ac4a// 红米:(red) 00000000-3cfe-a96a-ffff-ffffef05ac4aString devices2=DeviceIdUtil.getDeviceId(this);LogUitl.e("=================de2:"+devices2);//  红米:(blue)  9E75538F6FAEA9FBE4F8EEC7C6F0658BE489E4D4// 红米:(red) 461B0F937483EECCB5EB7A35D27F641EB3999CA

Android 设备Id 唯一不重复,Redmi相关推荐

  1. 是否有唯一的Android设备ID?

    Android设备是否具有唯一的ID,如果是,则使用Java访问它的简单方法是什么? #1楼 有许多不同的方法可以解决这些ANDROID_ID问题(有时可能为null或特定模型的设备总是返回相同的ID ...

  2. android设备id完美解决方法,如何在Android中获取唯一的设备硬件ID?

    您可以在下面的链接中查看此博客 [http://android-developers.blogspot.in/2011/03/identifying-app-installations.html] A ...

  3. 获得Android设备的唯一序列号

    理论部分 1.每个设备都有一个唯一序列号,Android设备也不例外,PC上用Mac地址 实践部分 1.核心代码: Secure.getString(getContentResolver(),Secu ...

  4. java 如何获取设备号_java – 如何获取android设备ID?

    如何获取Android设备ID?我不知道什么是"背景". import android.content.Context; import android.provider.Setti ...

  5. jsb调用java_cocos2d-js | JSB 调用Java函数 | Android设备ID

    引擎版本:cocos2d-x-3.13 语言:cocos2d-js 几乎所有的游戏项目都有获取玩家设备ID的需求,这里记录一下使用cocos2d-js时的Android设备获取方式. 用JS获取And ...

  6. android 获取蓝牙设备id_不需要任何权限获得Android设备的唯一ID

    这个问题来自于Is there a unique Android device ID? 我对这个问题的答案做了整理,包括将另一篇文章加入进来作为补充,可以完美解决此问题. 作者提出的问题: Andro ...

  7. 是否有唯一的 Android 设备 ID?

    问: Android 设备是否有唯一 ID,如果有,使用 Java 访问它的简单方法是什么? 答1: 保持自己快人一步,享受全网独家提供的一站式外包任务.远程工作.创意产品订阅服务–huntsbot. ...

  8. 获取android设备唯一编号_获取android设备的唯一ID

    在Android开发者官方blog上已经有一篇文章对此做了总结(参考链接1), 这里结合自已查询的资料再总结一下, 并给出最终符合要求的解决方案. 1. ANDROID_ID, Secure.ANDR ...

  9. Android设备获取唯一识别码

    Android系统以及设备都有很多的"标识"号,比如常见的IMEI,SerizalNumber,UUID等概念,但是这些都存在一定程度上的不可靠性,到底如何标记一台Android设 ...

最新文章

  1. Android 开发入门学习
  2. docker 容器环境 检测方法
  3. 背水一战 Windows 10 (36) - 控件(弹出类): ToolTip, Popup, PopupMenu
  4. python matplotlib画折线图出现连线混乱_python使用matplotlib模块绘制多条折线图、散点图...
  5. 基于verilog的洗衣机设计
  6. 如何从零开始开发一款嵌入式产品(20年的嵌入式经验分享学习)
  7. jqGrid 实现这种select - 同一列的不同行的select 的option 不同
  8. Cisco 3550配置DHCP实例
  9. 【CentOS】Tomcat的安装
  10. 深信服桌面云-(1)
  11. Axure 8.0破解版下载
  12. OpenStack之keystone(身份认证服务)
  13. Matlab:完美涡旋光束
  14. eplan zw9文件_eplan 中ZW0格式是什么文件啊?
  15. IOS技术分享| 互动连麦场景实现
  16. PHP多维数组按照键进行排序(对KEY按ASSIIC码排序)
  17. 重塑矩阵(一个矩阵转化成另一个矩阵)
  18. 数据库练习(学生、课程、选课关系)
  19. 谷歌pixel3axl开发者模式_谷歌彻底取消开发者大会!安卓版微信“暗黑模式”要来了...
  20. 2019南京帆软春招

热门文章

  1. IP和网段的计算方法
  2. 公司内网openvpn部署,
  3. ctf入门题库_「ctf比赛」web安全CTF比赛习题(初级) - seo实验室
  4. 【读书向】阿里云天池大赛赛题解析——可视化
  5. 为什么学古琴的人越来越多?——【唐畅古琴】
  6. jedisPool相关参数说明
  7. svn的客户端从安装到运行
  8. SpringCloud项目搭建(六) —elastic-job的使用,以及consul的配置使用(衔接上篇)
  9. 如何调用阿里云、百度云API接口
  10. Git 使用过程中遇到的问题以及解决办法