Почему флаг isLockTaskPermitted ложный

Я пытаюсь программно закрепить экран на Android L. Мое приложение включает xml-файл с

<?xml version="1.0" encoding="utf-8"?>
<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-policies>
        <force-lock/>
        <watch-login/>
        <disable-camera/>
        <disable-keyguard-features/>
        <encrypted-storage/>
        <expire-password/>
        <limit-password/>
        <reset-password/>
        <set-global-proxy/>
        <wipe-data/>
    </uses-policies>
</device-admin>

Я установил приложение с правильными строками в файле AndroidManifest, где я определил AdminReceiver. Несколько недель назад все работало нормально, но сейчас, когда я вернулся к этому проекту, приложение просит меня подтверждать всплывающее окно «Pin screen» каждый раз при запуске приложения.

При отладке я заметил странное поведение devicePolicyManager.isAdminActive(componentName) верно devicePolicyManager.isDeviceOwnerApp(getPackageName()) верно

но

devicePolicyManager.isLockTaskPermitted(getPackageName()) неверно

Не имеет значения, устанавливаю ли я приложение в качестве владельца устройства с помощью adb commend dpm set-device-owner ... или отправив файл device_owner.xml в /data/system/

Мой вопрос: почему у приложения нет разрешения на блокировку экрана?


person k667    schedule 28.04.2016    source источник


Ответы (1)


Для этого вы должны вызвать setLockTaskPackages()

Ваш код должен выглядеть примерно так, как показано ниже.

Ваша активность должна иметь

ComponentName mAdminComponentName = DeviceAdminReceiver.getComponentName(this);
//where this will be your Activity

DevicePolicyManager mDevicePolicyManager = (DevicePolicyManager)
                getSystemService(Context.DEVICE_POLICY_SERVICE);

mDevicePolicyManager.setLockTaskPackages(mAdminComponentName,new String[]{getPackageName()});

DeviceAdminReceiver.java

// Copyright 2016 Google Inc.
// 
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// 
//      http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package com.google.codelabs.cosu;

/**
 * Created by nyfuchs on 4/26/16.
 */

import android.content.ComponentName;
import android.content.Context;

/**
 * Handles events related to the managed profile.
 */
public class DeviceAdminReceiver extends android.app.admin.DeviceAdminReceiver {
    private static final String TAG = "DeviceAdminReceiver";

    /**
     * @param context The context of the application.
     * @return The component name of this component in the given context.
     */
    public static ComponentName getComponentName(Context context) {
        return new ComponentName(context.getApplicationContext(), DeviceAdminReceiver.class);
    }
}

AndroidManifest.xml

    <receiver
        android:name="com.google.codelabs.cosu.DeviceAdminReceiver"
        android:description="@string/app_name"
        android:label="@string/app_name"
        android:permission="android.permission.BIND_DEVICE_ADMIN">
        <meta-data
            android:name="android.app.device_admin"
            android:resource="@xml/device_admin_receiver" />
        <intent-filter>
            <action android:name="android.intent.action.DEVICE_ADMIN_ENABLED"/>
            <action android:name="android.intent.action.PROFILE_PROVISIONING_COMPLETE"/>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
        </intent-filter>
    </receiver>
person Vivek A Naik    schedule 16.08.2016