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(); }