在 Android 上向现有设备管理员添加新的使用策略
Posted
技术标签:
【中文标题】在 Android 上向现有设备管理员添加新的使用策略【英文标题】:Adding new uses-policies to existing device administrator on Android 【发布时间】:2015-09-27 21:52:27 【问题描述】:我有一个使用以下 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 />
我想知道如何检测是否以编程方式添加了新的使用策略,以便我们推送设备管理员权限的重新激活?
【问题讨论】:
你找到了任何方法吗??? 【参考方案1】:AFAIK 的唯一方法是从您的 apk 中读取您的 device-admin.xml,您可以通过这种方式(从 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;
【讨论】:
【参考方案2】:要检查您的活动管理员是否已授予策略,您可以使用 https://developer.android.com/reference/android/app/admin/DevicePolicyManager#hasGrantedPolicy(android.content.ComponentName,%20int)
为了验证使用来自 device-admin.xml 的策略,我更喜欢使用
https://developer.android.google.cn/reference/android/app/admin/DeviceAdminInfo.html?hl=zh-cn#usesPolicy(int)
但是当usesPolicy
返回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
【讨论】:
以上是关于在 Android 上向现有设备管理员添加新的使用策略的主要内容,如果未能解决你的问题,请参考以下文章