0

嗨,对于我正在处理的项目,我必须关闭 android 设备的屏幕。在这里搜索后,我开始使用此代码:

public static final int REQUEST_ADMIN_ENABLE = 12345;
ComponentName dPAComponent;
DevicePolicyManager devicePolicyManager;

public void screenOff(){
    dPAComponent = new ComponentName(this, AdminReceiver.class);
    devicePolicyManager = (DevicePolicyManager)
            getApplicationContext().getSystemService(Context.DEVICE_POLICY_SERVICE);
    Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
    intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, dPAComponent);
    intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "pls gib");
    startActivityForResult(intent, REQUEST_ADMIN_ENABLE);
}

@Override
protected void onActivityResult(int request, int result, Intent data){
    super.onActivityResult(request, result, data);
    if(devicePolicyManager.isAdminActive(dPAComponent)){
        if(result == RESULT_OK) {

            switch (request) {
                case REQUEST_ADMIN_ENABLE:
                    devicePolicyManager.lockNow();
                    break;
            }
        }

    }
}

一旦在活动中按下按钮,就会运行“screenOff”。“AdminReceiver.class”看起来像这样:

public class AdminReceiver extends DeviceAdminReceiver {

    @Override
    public void onEnabled(Context context, Intent intent) {
        Log.d("AdminReceiver", "Device Admin enabled");
        //Common.becomeHomeActivity(context);
    }

    @Override
    public CharSequence onDisableRequested(Context context, Intent intent) {
        return "Warning: Device Admin is going to be disabled.";
    }

    @Override
    public void onDisabled(Context context, Intent intent) {
        Log.d("AdminReceiver", "Device Admin disabled");
    }

    @Override
    public void onLockTaskModeEntering(Context context, Intent intent, String pkg) {
        Log.d("AdminReceiver", "Kiosk Mode enabled");
    }

    @Override
    public void onLockTaskModeExiting(Context context, Intent intent) {
        Log.d("AdminReceiver", "Kiosk Mode disabled");
    }
}

这似乎对其他人有用,我什至尝试了一些以相同方式工作的 github 项目。但是,我不断收到以下错误消息,由“devicePolicyManager.lockNow();”触发:

Caused by: java.lang.SecurityException: No active admin owned by uid 10109 for policy #3

显然我在这里做错了什么。谁能帮我找到它?

PS:我的 AndroidManifest.xml 包含以下几行,让您知道:

    <receiver
        android:name=".AdminReceiver"
        android:label="My DeviceAdmin"
        android:permission="android.permission.BIND_DEVICE_ADMIN" >
        <meta-data
            android:name="android.app.device_admin"
            android:resource="@xml/device_admin" />

        <intent-filter>
            <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
        </intent-filter>
    </receiver>

提前致谢

4

1 回答 1

0

感谢用户CommonsWare我发现该res/xml/device_admin.xml文件是空的:

<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-policies>

    </uses-policies>
</device-admin>

就我而言,它应该如下所示:

<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-policies>
        <force-lock />
    </uses-policies>
</device-admin>

非常感谢您的快速回答!

在复制粘贴我不太明白的代码之前,我应该阅读 developer.android.com 上的设备管理页面。下次我会

于 2017-12-08T11:54:20.853 回答