避免“无活动管理员拥有”的安全异常

16
如何避免这个异常。
E/AndroidRuntime(26113): Caused by: java.lang.SecurityException: No active admin owned by uid XXXX for policy #3

当调用这个函数时:

public static void lockScreen(Context context) {
    Log.d(TAG, "lockScreen");
    ComponentName mDeviceAdminSample = null;
    DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
    Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
    intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mDeviceAdminSample);
    dpm.lockNow();
}
6个回答

9

我遇到了和提问者相同的错误。由于只有其他答案的组合帮助了我,下面是我用来让提问者的代码示例工作的步骤:

  1. Make sure you have created device admin receiver and xml policy file as described in https://developer.android.com/guide/topics/admin/device-admin.html
  2. Add admin receiver with xml policy file reference to Manifest.
  3. Install your app
  4. Enable app as admin in Setting>Security>Device administrators>"Your app admin receiver label value"
  5. or do [4] programmatically

    mDeviceAdminSample = new ComponentName(this,DeviceAdminSampleReceiver.class);
    Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
    intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mDeviceAdminSample);
    currActivity.startActivityForResult(intent, 0);
    

5

3
你漏掉了下面这行代码。
mDeviceAdminSample = new ComponentName(this, DeviceAdminSampleReceiver.class);

2

Notice how the lines:

        Intent it = new         Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
        it.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, new ComponentName(this, YourAdminReceiver.class));
        startActivityForResult(it, 0);

可以跳过。如果你不想让用户允许应用锁屏,还有另一种选择:

adb shell dpm set-device-owner com.package/.YourAdminReceiver

现在这与OP遇到的SecurityException有什么关系呢?
嗯,我已经通过adb shell的方式将设备所有者设置为com.package/.YourAdminReceiver,但目的不是锁屏。当我在我的device-admin.xml中添加了<force-lock>标签时:
<uses-policies>
        <limit-password />
        <reset-password />
        <force-lock />
    </uses-policies>

我自然希望我的locknow() API调用能够正常运行,但事实上它并没有。我遇到了与OP相同的SecurityException错误。很奇怪,因为我的应用已经是设备的管理员和所有者了。我通过取消设备所有者角色、卸载应用程序,然后重新安装它来解决了这个问题。请注意,一旦通过adb shell设置为设备所有者,只能通过代码取消该角色:

//        mDpm.clearDeviceOwnerApp(getPackageName());
//        mDpm.removeActiveAdmin(deviceAdmin);

0

你需要做三件事:

  1. 在AndroidManifest中添加<receiver>
  2. <device-admin>创建新的xml文件
  3. DeviceAdminReceiver创建新的.kt文件

这里是我已经回答过的一个问题的链接(包含示例代码):stackoverflow.com

参考资料来自developer.android.com


0
在我的情况下,设备管理员是一项测试工具的一部分,而不是我的应用本身。结果发现这是 Android 处理权限的一个漏洞。解决方法是将设备管理员类、清单和策略移动到目标应用程序中。当然,这并不是理想的解决方案,但我看不到其他更好的方式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接