Запустите намерение DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN из службы
У меня есть сервис, и я хочу, чтобы сервис продвигал его как Device Admin, до сих пор я запускал такого рода 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);
Это просто сбой, потому что этот код находится внутри протектора внутри службы. Идеи?
2 ответа
Я только что исправил такую проблему для себя.
Обратите внимание, что вам нужно поместить этот код в parent в файле 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>
и это работает:)
Причина в коде самого класса 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.
Вам даже не нужно открывать всплывающий интерфейс администратора устройства с настройками безопасности. Вот способ сделать это прагматично:
Runtime.getRuntime("dpm set-device-admin --user 0 com.mydeviceadmin/.deviceAdminReceiver")
где приемник необходимо определить в манифесте, как описано в руководстве разработчика Android:
Обзор администрирования устройства
Протестировано на android 6.0
Дэвид