避免SecurityException,因为“没有活动的管理员拥有”

问题描述 投票:6回答:5

如何避免这种例外

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();
}
android admin securityexception
5个回答
4
投票

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


3
投票

你错过了这一行。

mDeviceAdminSample = new ComponentName(this, DeviceAdminSampleReceiver.class);

0
投票

注意如何划线:

        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,但出于与屏幕锁定不同的目的。当我将<force-lock>标记添加到我的device-admin.xml时:

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

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

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

0
投票

我得到了与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);

0
投票

设备管理员弃用。从Android 9(API级别28)开始,某些管理员策略在设备管理员调用时将被标记为已弃用。我们建议您立即开始准备此更改。要了解更多信息并查看迁移选项,请阅读Device admin弃用

© www.soinside.com 2019 - 2024. All rights reserved.