Работа для администратора устройства api не имеет собственного профиля

Я проработал через admin admin api, и при вызове функции setPermissionGrantState на DevicePolicyManager я получил

 Unable to start receiver com.xx.admin.receivers.AdminReceiver: java.lang.SecurityException: Admin ComponentInfo{com.xx/com.xx.admin.receivers.AdminReceiver} does not own the profile. 

Я понимаю, что есть определенные функции, которые могут выполняться только владельцами устройств / профилей. Более того, это способ NFC provisioning and dpm command . Но это вряд ли так, как я хочу, когда я распространяю свое приложение. Есть ли способ автоматизировать это авторизацию, попросив пользователя разрешить моему приложению владение профилем с / без root.

Вот мой приемник

 class AdminReceiver : DeviceAdminReceiver() { var manager: DevicePolicyManager? = null override fun onEnabled(context: Context?, intent: Intent?) { super.onEnabled(context, intent) manager = getManager(context) manager!!.setPermissionGrantState(getComponentName(context!!) , "com.abc.app" , Manifest.permission.WRITE_EXTERNAL_STORAGE , DevicePolicyManager.PERMISSION_GRANT_STATE_DENIED) } fun getComponentName(context: Context): ComponentName { return ComponentName(context.applicationContext, AdminReceiver::class.java) } } 

Владелец устройства или приложение владельца профиля должны быть установлены во время настройки устройства или рабочего профиля. В отличие от администратора устройства, он не может быть изменен после установки без заводского сброса (или удаления рабочего профиля). Чтобы настроить приложение как владельца устройства или владельца профиля, см. Документацию разработчиков Android EMM .

Это довольно сложно реализовать в собственном приложении, и вместо этого вам следует рассмотреть возможность использования API управления Android, который предлагает те же функции, что и более простой облачный API. Например, эквивалент setPermissionGrantStatePermissionGrant .

Предоставление NFC требуется только для установки владельца устройства.

Я бы сказал, что команда dpm обычно используется также для тестирования / настройки владельца устройства (для этого я и использовал), но вы также можете установить владельца профиля.

Вы можете настроить управляемый профиль программно, используя приведенный ниже код. Приложения, которые вы хотите управлять, должны быть установлены в этом профиле. Этот код был основан на android-AppRestrictionEnforcer.

 /** * Initiates the managed profile provisioning. If we already have a managed profile set up on * this device, we will get an error dialog in the following provisioning phase. */ private void provisionManagedProfile() { Activity activity = getActivity(); if (null == activity) { return; } Intent intent = new Intent(ACTION_PROVISION_MANAGED_PROFILE); if (Build.VERSION.SDK_INT >= 24) { intent.putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, CustomDeviceAdminReceiver.getComponentName(activity)); } else { //noinspection deprecation intent.putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME, activity.getApplicationContext().getPackageName()); intent.putExtra(EXTRA_DEVICE_ADMIN, CustomDeviceAdminReceiver.getComponentName(activity)); } if (intent.resolveActivity(activity.getPackageManager()) != null) { startActivityForResult(intent, REQUEST_PROVISION_MANAGED_PROFILE); activity.finish(); } else { Toast.makeText(activity, "Device provisioning is not enabled. Stopping.", Toast.LENGTH_SHORT).show(); } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_PROVISION_MANAGED_PROFILE) { if (resultCode == Activity.RESULT_OK) { Toast.makeText(getActivity(), "Provisioning done.", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(getActivity(), "Provisioning failed.", Toast.LENGTH_SHORT).show(); } return; } super.onActivityResult(requestCode, resultCode, data); }