Android设备的各种唯一标识符 ID

IMEI

只有Android手机才有, IMEI号是一串15位的号码,比如像这样 359881030314356

TelephonyManager TelephonyMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
String szImei = TelephonyMgr.getDeviceId();

需要权限android.permission.READ_PHONE_STATE
通常用户会因为你向他们要了这个权限而给你一个差评,因为他们觉得你就是在窃取他们的隐私,很明显,你就是在收集一些数据

Android ID

这个是不靠谱的,因为有时候它是null的,文档中明确说明,如果你恢复了出厂设置,那他就会改变的。而且如果你root了手机,你也可以手动改变这个ID。

String m_szAndroidID = Secure.getString(getContentResolver(), Secure.ANDROID_ID);

它返回的是9774d56d682e549c这样一串东西,倒是不需要什么权限。
部分设备由于制造商错误实现,导致多台设备会返回相同的 Android_ID.

WLAN MAC地址

这也可以得到一个独一无二的ID号,返回的是 00:11:22:33:44:55 。但是当没有wifi的时候,我们是无法获得数据的。

WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE);
String m_szWLANMAC = wm.getConnectionInfo().getMacAddress();

需要权限 android.permission.ACCESS_WIFI_STATE

蓝牙MAC地址

市面上大部分的应用不使用蓝牙,如果你的应用根本没用蓝牙,而你却和用户要了蓝牙权限的,那你很可疑。

BluetoothAdapter m_BluetoothAdapter = null;
m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); String m_szBTMAC = m_BluetoothAdapter.getAddress();

需要权限android.permission.BLUETOOTH

设备序列号(Serial Number, SN)

获取办法:

String serialNum = android.os.Build.SERIAL;
// android 8.0之后要用下面
String serialNum = android.os.Build.getSerial()

比如 01b4549262d6a4a2,是比较稳定的设备硬件标识符
从api 26:android 8.0 oreo开始,需要 android.permission.READ_PHONE_STATE 权限。不推荐使用

AAID 和 OAID

AAID是Android平台内的广告跟踪ID,OAID为AAID在国内的替代ID。

由于AAID依托于Google服务框架,但在国内使用Google服务并不可行,而且大部分国产手机内置的Google服务并不完整,所以App开发者需要寻找新的方式去标识用户,于是OAID应运而生。

可以通过miit_mdid包来获取AAID和OAID。

下载miit_mdid_1.0.10.aar,放进项目的libs路径下

在模块的<build.gradle>的dependencies段加入:

implementation fileTree(dir: 'libs', include: ['*.aar'])
//初始化
fun initJLibrary(context: Context?) {
    
    
    if (Build.VERSION.SDK_INT > 28) {
    
    
        JLibrary.InitEntry(context)
    }
}

// MdidSdkHelper.InitSdk的回调函数中获取oaid和aaid

@Synchronized
fun updateOaidIfNull(context: Context?) {
    
    
    if (Build.VERSION.SDK_INT <= 28)
        return

    MdidSdkHelper.InitSdk(context, true,
        IIdentifierListener {
    
     z, idSupplier ->
            val oaid = idSupplier.oaid
            var aaid = idSupplier.aaid

Pseudo ID

使用硬件信息拼凑出来的15位号码

/**
 * Return pseudo unique ID
 * @return ID
 */
public static String getPsuedoUniqueID()
{
    
    
    // If all else fails, if the user does have lower than API 9 (lower
    // than Gingerbread), has reset their phone or 'Secure.ANDROID_ID'
    // returns 'null', then simply the ID returned will be solely based
    // off their Android device information. This is where the collisions
    // can happen.
    // Thanks http://www.pocketmagic.net/?p=1662!
    // Try not to use DISPLAY, HOST or ID - these items could change.
    // If there are collisions, there will be overlapping data
    String m_szDevIDShort = "35" +
            (Build.BOARD.length() % 10)
            + (Build.BRAND.length() % 10)
            + (Build.CPU_ABI.length() % 10)
            + (Build.DEVICE.length() % 10)
            + (Build.MANUFACTURER.length() % 10)
            + (Build.MODEL.length() % 10)
            + (Build.PRODUCT.length() % 10);

    // Thanks to @Roman SL!
    // http://stackoverflow.com/a/4789483/950427
    // Only devices with API >= 9 have android.os.Build.SERIAL
    // http://developer.android.com/reference/android/os/Build.html#SERIAL
    // If a user upgrades software or roots their phone, there will be a duplicate entry
    String serial = null;
    try
    {
    
    
        serial = android.os.Build.class.getField("SERIAL").get(null).toString();

        // Go ahead and return the serial for api => 9
        return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
    }
    catch (Exception e)
    {
    
    
        // String needs to be initialized
        serial = "serial"; // some value
    }

    // Thanks @Joe!
    // http://stackoverflow.com/a/2853253/950427
    // Finally, combine the values we have found by using the UUID class to create a unique identifier
    return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
}

Widevine ID

DRM数字版权管理ID

MediaDrm 是一个 Android 框架 API,允许用户安全地向 MediaCodec 提供加密密钥,以便以安全的方式播放优质内容。

MediaDrm 与不同的 DRM 提供商合作。Google 的 Widevine,以及 Microsoft 的 PlayReady,具体取决于设备。

当设备第一次使用 DRM 时,会发生设备配置,这意味着设备将获得唯一的证书,并将存储在设备的 DRM 服务中。

此配置文件具有唯一 ID,您可以通过简单的调用获取它。

/**
 * 获取数字版权管理设备ID
 *
 * @return WidevineID,可能为空
 */
public static String getWidevineID() {
    
    
    try {
    
    
        //See https://stackoverflow.com/questions/16369818/how-to-get-crypto-scheme-uuid
        //You can find some UUIDs in the https://github.com/google/ExoPlayer source code
        final UUID WIDEVINE_UUID = new UUID(0xEDEF8BA979D64ACEL, 0xA3C827DCD51D21EDL);
        MediaDrm mediaDrm = new MediaDrm(WIDEVINE_UUID);
        byte[] widevineId = mediaDrm.getPropertyByteArray(MediaDrm.PROPERTY_DEVICE_UNIQUE_ID);
        if (widevineId == null) {
    
    
            return "";
        }
        StringBuilder sb = new StringBuilder();
        for (byte aByte : widevineId) {
    
    
            sb.append(String.format("%02x", aByte));
        }
        return sb.toString();
    } catch (Exception e) {
    
    
        OAIDLog.print(e);
    } catch (Error e) {
    
    
        OAIDLog.print(e);
    }
    return "";
}

访问此 ID 不需要任何权限。
您将获得的 ID 是一个 16 字节数组,这个 ID 不仅在所有应用程序上都是相同的,而且对于设备的所有用户也是相同的。因此,来宾帐户也将获得相同的 ID。

猜你喜欢

转载自blog.csdn.net/lovelyelfpop/article/details/128916267