如何在android Q中获得唯一id?卸载和安装应用程序时必须相同

如何在android Q中获得唯一id?卸载和安装应用程序时必须相同,android,android-10.0,Android,Android 10.0,我们使用序列号进行唯一设备标识。在android Q中,我们无法访问该设备信息。所以我们选择了Unique id,但它在卸载和安装应用程序时会发生变化。我需要一个主意。提前感谢官方文档称,访问基于设备的信息(串行、Imei、DeviceId、Meid、SimSerialNumber SubscriberId等)默认情况下是受限的 为了访问此类信息,官方文件称,你应该将你的应用程序设置为设备或个人资料所有者应用程序,拥有特殊的运营商权限,或者使用READ_PRIVILEGED_PHONE_状态,这

我们使用序列号进行唯一设备标识。在android Q中,我们无法访问该设备信息。所以我们选择了Unique id,但它在卸载和安装应用程序时会发生变化。我需要一个主意。提前感谢

官方文档称,访问基于设备的信息(串行、Imei、DeviceId、Meid、SimSerialNumber SubscriberId等)默认情况下是受限的

为了访问此类信息,官方文件称,你应该将你的应用程序设置为设备或个人资料所有者应用程序,拥有特殊的运营商权限,或者使用READ_PRIVILEGED_PHONE_状态,这需要一种特殊的签名。你可以读更多


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

官方文档称,访问基于设备的信息(串行、Imei、DeviceId、Meid、SimSerialNumber SubscriberId等)默认情况下是受限的

为了访问此类信息,官方文件称,你应该将你的应用程序设置为设备或个人资料所有者应用程序,拥有特殊的运营商权限,或者使用READ_PRIVILEGED_PHONE_状态,这需要一种特殊的签名。你可以读更多


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

我面临着同样的问题,即卸载应用程序后唯一地识别设备。
android.provider.Settings.Secure.android\u ID
的问题在于,在卸载应用程序和重置设备后,它会不断变化

唯一适合我的解决方案是
MediaDrm
。它返回设备唯一id,该id在应用程序卸载甚至设备重置时保持不变。但有一点是,它为不同的应用程序包名称提供了不同的id。我是通过提问了解MediaDrm的

使用MediaDrm后,我了解了一些事情。很少有设备会为同一应用返回相同的id。例如,在我的例子中,很少有Vivo设备在使用MediaDrm时提供相同的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();
            }
        }
    }
}
@Nullable
公共静态字符串getUUId(){
if(Build.VERSION.SDK\u INT=Build.VERSION\u code.P){
wvDrm.close();
}否则{
wvDrm.release();
}
}
}
}

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

唯一适合我的解决方案是
MediaDrm
。它返回设备唯一id,该id在应用程序卸载甚至设备重置时保持不变。但有一点是,它为不同的应用程序包名称提供了不同的id。我是通过提问了解MediaDrm的

使用MediaDrm后,我了解了一些事情。很少有设备会为同一应用返回相同的id。例如,在我的例子中,很少有Vivo设备在使用MediaDrm时提供相同的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();
            }
        }
    }
}
@Nullable
公共静态字符串getUUId(){
if(Build.VERSION.SDK\u INT=Build.VERSION\u code.P){
wvDrm.close();
}否则{
wvDrm.release();
}
}
}
}