Android获取设备唯一标识的方法

String uniqueId;
String mac = getMacAddressByInetAddress();
if (mac != null && !mac.equals("") && !mac.equals("02:00:00:00:00:00")) {
    uniqueId = mac;
} else if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.JELLY_BEAN_MR2 && getWidevineId() != null && !getWidevineId().equals("")) {
    uniqueId = getWidevineId();
} else {
    uniqueId = getPseudoID();
}
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
public static String getWidevineId() {
    String sRet = "";

    UUID WIDEVINE_UUID = new UUID(-0x121074568629b532L, -0x5c37d8232ae2de13L);
    MediaDrm mediaDrm = null;

    try {
        mediaDrm = new MediaDrm(WIDEVINE_UUID);
        byte[] widevineId = mediaDrm.getPropertyByteArray(MediaDrm.PROPERTY_DEVICE_UNIQUE_ID);

        MessageDigest md = MessageDigest.getInstance("SHA-256");
        md.update(widevineId);

        sRet = bytesToHex(md.digest()); //we convert byte[] to hex for our purposes
    } catch (Exception e) {
        //WIDEVINE is not available
        e.printStackTrace();
        Log.d("debug", "获取(媒体数字版权管理(digit rights management)ID抛出异常)");
    } finally {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            if(null!=mediaDrm) {
                mediaDrm.close();
            }
        } else {
            if(null!=mediaDrm) {
                mediaDrm.release();
            }
        }
    }

    return sRet;
}

private static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray();
public static String bytesToHex(byte[] bytes) {
    char[] hexChars = new char[bytes.length * 2];
    for (int j = 0; j < bytes.length; j++) {
        int v = bytes[j] & 0xFF;
        hexChars[j * 2] = HEX_ARRAY[v >>> 4];
        hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F];
    }
    return new String(hexChars);
}

private String getMacAddressByInetAddress() {
    try {
        InetAddress inetAddress = getInetAddress();
        if (inetAddress != null) {
            NetworkInterface ni = NetworkInterface.getByInetAddress(inetAddress);
            if (ni != null) {
                byte[] macBytes = ni.getHardwareAddress();
                if (macBytes != null && macBytes.length > 0) {
                    StringBuilder sb = new StringBuilder();
                    for (byte b : macBytes) {
                        sb.append(String.format("%02x:", b));
                    }
                    return sb.substring(0, sb.length() - 1);
                }
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return "02:00:00:00:00:00";
}

private InetAddress getInetAddress() {
    try {
        Enumeration<NetworkInterface> nis = NetworkInterface.getNetworkInterfaces();
        while (nis.hasMoreElements()) {
            NetworkInterface ni = nis.nextElement();
            // To prevent phone of xiaomi return "10.0.2.15"
            if (!ni.isUp()) continue;
            Enumeration<InetAddress> addresses = ni.getInetAddresses();
            while (addresses.hasMoreElements()) {
                InetAddress inetAddress = addresses.nextElement();
                if (!inetAddress.isLoopbackAddress()) {
                    String hostAddress = inetAddress.getHostAddress();
                    if (hostAddress.indexOf(':') < 0) return inetAddress;
                }
            }
        }
    } catch (SocketException e) {
        e.printStackTrace();
    }
    return null;
}
public static String getPseudoID() {
    final int MODULUS = 10;
    StringBuilder sb = new StringBuilder();
    sb.append(Build.BOARD.length() % MODULUS);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        sb.append(java.util.Arrays.deepToString(Build.SUPPORTED_ABIS).length() % MODULUS);
    } else {
        // noinspection deprecation
        sb.append(Build.CPU_ABI.length() % MODULUS);
    }
    sb.append(Build.DEVICE.length() % MODULUS);
    sb.append(Build.DISPLAY.length() % MODULUS);
    sb.append(Build.HOST.length() % MODULUS);
    sb.append(Build.ID.length() % MODULUS);
    sb.append(Build.MANUFACTURER.length() % MODULUS);
    sb.append(Build.BRAND.length() % MODULUS);
    sb.append(Build.MODEL.length() % MODULUS);
    sb.append(Build.PRODUCT.length() % MODULUS);
    sb.append(Build.BOOTLOADER.length() % MODULUS);
    sb.append(Build.HARDWARE.length() % MODULUS);
    sb.append(Build.TAGS.length() % MODULUS);
    sb.append(Build.TYPE.length() % MODULUS);
    sb.append(Build.USER.length() % MODULUS);
    return sb.toString();
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值