向Android上的现有设备管理员添加新的使用策略
我有一个设备管理应用程序,它使用以下device-admin.xml向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 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
returntrue
时,并不意味着活动管理员可以使用它
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
}