I have a device admin app that uses the following 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>
Some users has already activated the device admin permissions. Now, in an update of the app, I want to add a new uses-policy
<limit-password />
I am wondering how to detect that new use policies have been added programmatically so that we push the reactivation of the device admin permissions?
AFAIK the only way is read your device-admin.xml from your apk, and you can do it in this way (from an Activity):
PackageManager packageManager = getPackageManager();
List <PackageInfo> packageInfoList = packageManager.getInstalledPackages(0);
for (PackageInfo packageInfo : packageInfoList) {
String publicSourceDir = packageInfo.applicationInfo.publicSourceDir;
if (publicSourceDir.contains("your/app/path")) { // or equals, which you prefer
File apkFile = new File(publicSourceDir);
if (apkFile.exists()) {
try {
JarFile jarFile = new JarFile(apkFile);
JarEntry jarEntry = jarFile.getJarEntry("xml/device-admin.xml");
InputStream is = jarFile.getInputStream(jarEntry);
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String str;
while ((str = br.readLine()) != null) {
Log.d("entry: ", str); // your entries in the device-admin.xml
}
} catch (IOException e) {
e.printStackTrace();
}
}
break;
}
}
To check if your active admin has granted policy, you can use https://developer.android.com/reference/android/app/admin/DevicePolicyManager#hasGrantedPolicy(android.content.ComponentName,%20int)
To verify uses policies from device-admin.xml I prefer to use
https://developer.android.google.cn/reference/android/app/admin/DeviceAdminInfo.html?hl=zh-cn#usesPolicy(int)
but when usesPolicy
return true
it doesn't mean that the active admin can use it.
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
}
来源:https://stackoverflow.com/questions/31318890/adding-new-uses-policies-to-existing-device-administrator-on-android