从服务运行intent DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN

Zor*_*orb 6 android task android-intent device-policy-manager

我有一项服务,我想要服务推广,以启用它作为设备管理员,直到现在我从服务启动这种类型的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);
Run Code Online (Sandbox Code Playgroud)

它的工作原理,但使用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);
Run Code Online (Sandbox Code Playgroud)

不起作用:不要宣传任何东西,但也不要崩溃.没有intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);它只是崩溃,因为这段代码在服务内部.想法?

Bey*_*Ham 6

原因在于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;
       }
Run Code Online (Sandbox Code Playgroud)

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


Vil*_*usK 5

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

请注意,您需要将此代码放入 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>
Run Code Online (Sandbox Code Playgroud)

它有效:)