设备管理无法正常工作

时间:2017-07-14 19:59:46

标签: android kiosk device-admin

我创建了一个自助服务终端应用,我正在尝试将我的设备设置为管理员。每当我检查我是否处于活动状态时,它都会返回false

private void provisionOwner() {
    DevicePolicyManager manager =
            (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
    ComponentName componentName = BasicDeviceAdminReceiver.getComponentName(this);

    if(!manager.isAdminActive(componentName)) {
        Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
        intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName);
        startActivityForResult(intent, 0);
        return;
    }

    if (manager.isDeviceOwnerApp(getPackageName()))
        manager.setLockTaskPackages(componentName, new String [] {getPackageName()});
}

在检查设备是否为admin并且我收到错误之前,我按照执行命令行脚本的说明进行操作。

adb shell dpm set-device-owner com.testapp/.DeviceAdminReceiver

我得到的错误是

enter image description here

对于AndroidManifest.xml,我添加了蓝牙权限

<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

对于AndroidManifest.xml,我注册了DeviceAdminReceiver

    <receiver
        android:name="<my package>.DeviceAdminReceiver"
        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" />

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

我的device_admin.xml如下:

<?xml version="1.0" encoding="utf-8"?>
<device-admin>
    <uses-policies>
        <wipe-data/>
        <force-lock/>
        <disable-camera/>
        <disable-keyguard-features/>
    </uses-policies>
</device-admin>

是否有必要设置Kiosk模式,让我的设备管理员?如果是这样,为什么我收到此错误?

2 个答案:

答案 0 :(得分:1)

作为设备所有者和设备管理员之间存在差异。您正在设置一个(设备管理员)并检查另一个(设备所有者)。

设备所有者通常在Google向导开头的设备配置期间设置。但也可以在使用您提到的dpm命令浏览Google向导后进行设置。如果设备上没有帐户,则dpm命令只能设置设备所有者。由于具有控制权,设备所有者在可以设置时受到限制。公司拥有的设备通常将配置MDM / EMM作为设备所有者。

设备管理员对设备的控制权限要大得多。但它可以在任何时候添加。自Android Enterprise(Android for Work [AfW])在Lollipop发布以来,每个Android版本都限制了设备管理员可以做的事情。

最完整的自助服务终端解决方案将使用应用作为设备所有者设置设备。我见过的其他解决方案是使用自定义启动器通过将应用程序列入白名单来锁定设备,但此实现存在很多安全漏洞。

查看TestDPC应用程序。谷歌为它提供了源代码,它将拥有大部分(如果不是你所需要的)。使用它作为设备所有者提供的控件。

https://developers.google.com/android/work/build-dpc

https://github.com/googlesamples/android-testdpc

我的猜测是您的应用未正确设置为设备所有者或设备管理员。具体来看,您会看到清单中的android:permission="android.permission.BIND_DEVICE_ADMIN"声明了一个DeviceAdminReceiver,以及一个包含它可能使用的策略的xml资源文件。更多源代码将有助于调试您看到的问题。

答案 1 :(得分:1)

您只需使用: startActivity(new Intent().setComponent(new ComponentName("com.android.settings", "com.android.settings.DeviceAdminSettings")));