问题描述
我们正在使用序列号来唯一标识设备。在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();
}
}
}
}