向Android上的现有设备管理员添加新的使用策略

向Android上的现有设备管理员添加新的使用策略,android,android-manifest,android-permissions,android-securityexception,Android,Android Manifest,Android Permissions,Android Securityexception,我有一个设备管理应用程序,它使用以下device-admin.xml <device-admin xmlns:android="http://schemas.android.com/apk/res/android"> <uses-policies> <watch-login /> <reset-password /> <force-lock /> <wipe-data /> <

我有一个设备管理应用程序,它使用以下device-admin.xml

<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
 <uses-policies>
     <watch-login />
     <reset-password />
     <force-lock />
     <wipe-data />
 </uses-policies>
</device-admin>

某些用户已激活设备管理员权限。现在,在应用程序的更新中,我想添加一个新的使用策略

 <limit-password />


我想知道如何检测新的使用策略已以编程方式添加,以便我们推动设备管理员权限的重新激活?

AFAIK唯一的方法是从apk读取device-admin.xml,您可以通过这种方式(从活动中)执行此操作:

PackageManager-PackageManager=getPackageManager();
List PackageInfo列表=packageManager.getInstalledPackages(0);
对于(PackageInfo PackageInfo:PackageInfo列表){
字符串publicSourceDir=packageInfo.applicationInfo.publicSourceDir;
if(publicSourceDir.contains(“your/app/path”){//或等于,您更喜欢哪个
文件apkFile=新文件(publicSourceDir);
if(apkFile.exists()){
试一试{
JarFile JarFile=新的JarFile(apkFile);
JarEntry JarEntry=jarFile.getJarEntry(“xml/device admin.xml”);
InputStream=jarFile.getInputStream(jarEntry);
BufferedReader br=新的BufferedReader(新的InputStreamReader(is));
字符串str;
而((str=br.readLine())!=null){
Log.d(“entry:,str);//您在device-admin.xml中的条目
}
}捕获(IOE异常){
e、 printStackTrace();
}
}
打破
}
}

要检查您的活动管理员是否已授予策略,您可以使用

要验证是否使用device-admin.xml中的策略,我更喜欢使用 但是当
usesPolicy
return
true
时,并不意味着活动管理员可以使用它

ComponentName componentName = new ComponentName(context, MyDeviceAdminReceiver.class);
ResolveInfo resolveInfo = new ResolveInfo();
resolveInfo.activityInfo = context.getPackageManager().getReceiverInfo(componentName, PackageManager.GET_META_DATA);
DeviceAdminInfo info = new DeviceAdminInfo(context, resolveInfo);

if (info.usesPolicy(DeviceAdminInfo.USES_POLICY_LIMIT_PASSWORD)) {
    //your application declared <limit-password/> in device_admin.xml
}

DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
if (dpm.hasGrantedPolicy(componentName, DeviceAdminInfo.USES_POLICY_LIMIT_PASSWORD)) {
    //active device admin has granted <limit-password/> policy
}
ComponentName ComponentName=newcomponentname(上下文,MyDeviceAdminReceiver.class);
ResolveInfo ResolveInfo=新的ResolveInfo();
resolveInfo.activityInfo=context.getPackageManager().GetReceiveInfo(组件名,PackageManager.GET_元数据);
DeviceAdminInfo=新的DeviceAdminInfo(上下文,resolveInfo);
if(信息使用策略(设备管理信息使用策略、限制和密码)){
//您的应用程序在device_admin.xml中声明
}
DevicePolicyManager dpm=(DevicePolicyManager)context.getSystemService(context.DEVICE\u POLICY\u SERVICE);
if(dpm.hasGrantedPolicy(组件名称、设备管理信息使用\u策略\u限制\u密码)){
//活动设备管理员已授予策略权限
}

您找到了这样做的方法吗???
ComponentName componentName = new ComponentName(context, MyDeviceAdminReceiver.class);
ResolveInfo resolveInfo = new ResolveInfo();
resolveInfo.activityInfo = context.getPackageManager().getReceiverInfo(componentName, PackageManager.GET_META_DATA);
DeviceAdminInfo info = new DeviceAdminInfo(context, resolveInfo);

if (info.usesPolicy(DeviceAdminInfo.USES_POLICY_LIMIT_PASSWORD)) {
    //your application declared <limit-password/> in device_admin.xml
}

DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
if (dpm.hasGrantedPolicy(componentName, DeviceAdminInfo.USES_POLICY_LIMIT_PASSWORD)) {
    //active device admin has granted <limit-password/> policy
}