如何避免这种例外
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();
}
您必须按照参考文档:http://developer.android.com/guide/topics/admin/device-admin.html中的说明安装并启用设备管理员
你错过了这一行。
mDeviceAdminSample = new ComponentName(this, DeviceAdminSampleReceiver.class);
注意如何划线:
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);
我得到了与OP相同的错误。由于只有其他答案的组合对我有所帮助,这里是我的步骤,使OP代码示例工作:
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);
设备管理员弃用。从Android 9(API级别28)开始,某些管理员策略在设备管理员调用时将被标记为已弃用。我们建议您立即开始准备此更改。要了解更多信息并查看迁移选项,请阅读Device admin弃用