如何在Android Q中获取唯一ID?卸载和安装应用程序时必须相同

问题描述

我们正在使用序列号来唯一标识设备。在android Q中,我们无法访问该设备信息。因此我们选择了唯一ID,但是在卸载和安装该应用程序时会更改。需要一个想法。预先感谢

解决方法

官方文档说,默认情况下,访问基于设备的信息(Serial,Imei,DeviceId,Meid,SimSerialNumber SubscriberId等)是受限制的。

为了访问这类信息,官方文档说您应该将您的应用设置为设备或配置文件所有者应用,具有特殊的运营商许可,或使用需要特殊签名的READ_PRIVILEGED_PHONE_STATE。您可以阅读更多Here

作为一种解决方法,我建议尝试根据可能从设备获得的其他信息(蓝牙地址,wifi mac地址等)生成唯一的ID。这些不是100%稳定的,因为您可以通过一些编程来更改它们,但是对于大多数用户而言,它可以正常工作。

,

在卸载应用程序后,我面临着唯一标识设备的相同问题。 android.provider.Settings.Secure.ANDROID_ID的问题在于,在卸载应用并重置设备后,它会不断变化。

唯一适用于我的解决方案是MediaDrm。它会返回设备唯一ID,该ID在应用卸载甚至重置设备时都保持不变。但是有一件事,它为不同的应用程序包名称提供了不同的ID。我从this问题开始了解MediaDrm。

使用MediaDrm之后,我开始了解一些事情。很少有设备会为同一应用返回相同的ID。例如,就我而言,使用MediaDrm时,很少有Vivo设备提供相同的ID。所以您必须处理它。

这是使用MediaDrm获取该唯一ID的代码。

@Nullable
public static String getUUId() {

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) {
        return null;
    }
    
    UUID wideVineUuid = new UUID(-0x121074568629b532L,-0x5c37d8232ae2de13L);
    MediaDrm wvDrm = null;
    try {
        wvDrm = new MediaDrm(wideVineUuid);
        byte[] wideVineId = wvDrm.getPropertyByteArray(MediaDrm.PROPERTY_DEVICE_UNIQUE_ID);
        //optional encoding to convert the array in string.
        return Base64.encodeToString(wideVineId,Base64.NO_WRAP);

    } catch (Exception e) {
        e.printStackTrace();
        return null;

    } finally {
        if (wvDrm != null) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
                wvDrm.close();
            } else {
                wvDrm.release();
            }
        }
    }
}