13

如何避免此异常

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();
}
4

6 回答 6

9

我得到了与OP相同的错误。由于只有其他答案的组合对我有帮助,所以这是我使 OP 代码示例工作的步骤:

  1. 确保您已创建设备管理员接收器和 xml 策略文件,如https://developer.android.com/guide/topics/admin/device-admin.html中所述
  2. 将带有 xml 策略文件引用的管理员接收器添加到 Manifest。
  3. 安装您的应用
  4. 在设置>安全>设备管理员>“您的应用管理员接收标签值”中启用应用作为管理员
  5. 或以编程方式执行 [4]

    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);
    
于 2018-04-13T15:46:43.880 回答
5

您必须按照参考文档中的说明安装并启用设备管理员:http: //developer.android.com/guide/topics/admin/device-admin.html

于 2012-06-06T02:40:02.903 回答
3

您在下面的行中缺少此内容。

mDeviceAdminSample = new ComponentName(this, DeviceAdminSampleReceiver.class);
于 2015-05-29T12:00:19.893 回答
2

注意这些行:

        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 有什么关系?

好吧,我已经 com.package/.YourAdminReceiver通过 adb shell 方式设置了设备所有者,但目的与屏幕锁定不同。当我将<force-lock>标签添加到我的 device-admin.xml 时:

<uses-policies>
        <limit-password />
        <reset-password />
        <force-lock />
    </uses-policies>

我很自然地希望我的locknow()API 调用能够正常工作,但事实并非如此。我得到了SecurityException就像OP一样。奇怪,因为我的应用程序已经是设备的管理员和所有者。我通过从设备所有者角色中取消设置,将其卸载然后重新安装来使其工作。请注意,一旦通过 adb shell 设置为设备所有者,应用程序只能从代码中取消设置该角色:

//        mDpm.clearDeviceOwnerApp(getPackageName());
//        mDpm.removeActiveAdmin(deviceAdmin);
于 2017-01-10T14:11:15.287 回答
0

就我而言,设备管理员是仪器测试的一部分,而不是我的应用程序本身。原来是 Android 处理权限的方式中的一个错误。解决方法是将设备管理类、清单和策略移动到目标应用程序中。当然不理想,但我看不到解决方法。

于 2020-06-27T12:34:05.407 回答
0

你需要做 3 件事:

  1. 添加<receiver>到 AndroidManifest
  2. <device-admin>
  3. 制作新的 .kt 文件DeviceAdminReceiver

这是我已经做过的答案的链接(带有示例代码):stackoverflow.com

来自developer.android.com的参考资料

于 2021-06-03T06:04:57.723 回答