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