6

我有一个服务,我希望服务提升以将其作为设备管理员启用,直到现在我从服务中启动了这种 UI 交互,例如

    Intent intent2 = new Intent();
    intent2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent2.setAction(android.content.Intent.ACTION_VIEW);
    intent2.setDataAndType(uri, "application/vnd.android.package-archive");
    context.startActivity(intent2);

它可以工作,但是使用 DevicePolicyManager 我找不到方法:

        Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mAdminName);
        intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,  "some text.");
        context.startActivity(intent);

不起作用:不提倡什么,但也不要崩溃。如果没有intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);它,它只会崩溃,因为此代码位于服务的内部。想法?

4

3 回答 3

8

原因在于 Android DeviceAdminAdd 类本身的代码:

if ((getIntent().getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
            Log.w(TAG, "Cannot start ADD_DEVICE_ADMIN as a new task");
            finish();
            return;
       }

您应该考虑使用另一个活动来调用 DevicePolicyManager。

于 2013-06-25T12:44:56.910 回答
4

我刚刚为自己解决了这样的问题。

请注意,您需要将此代码放在 Android Manifest.xml 文件的父级中:

    <receiver
        android:name=".ScreenLockerDeviceAdminReceiver"
        android:permission="android.permission.BIND_DEVICE_ADMIN" >
        <meta-data
            android:name="android.app.device_admin"
            android:resource="@xml/device_admin_policies" />

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

它有效:)

于 2012-06-07T22:36:22.017 回答
0

您甚至不需要弹出安全设置的设备管理 UI。这是一种务实的方法:

Runtime.getRuntime("dpm set-device-admin --user 0 com.mydeviceadmin/.deviceAdminReceiver")  

需要在清单中定义接收器的位置,如 android 开发人员指南中所述:
设备管理概述

经安卓6.0测试

大卫

于 2019-08-25T19:27:38.907 回答