Проверка, есть ли уже рабочий профиль, кому он принадлежит и активен ли он - PullRequest
0 голосов
/ 13 июня 2018

То, что мне нужно, кажется довольно простым, и это настолько расстраивает, что Android для работы API, кажется, не предоставляет его "из коробки".

Я пытаюсьсоздайте приложение Android DPC для управления рабочим профилем и управления им.(НЕ владелец устройства).Когда вы предоставляете рабочий профиль, вы получаете два экземпляра вашего приложения.Один под маркой работает под рабочим профилем, а другой без бейджа работает под основным профилем.enter image description here

Я пытаюсь выяснить три вещи:

  • Рабочий профиль уже настроен на устройстве?
  • Если так, то мое приложение владеет профилем?Если нет, какое приложение работает?
  • Активен ли рабочий профиль?

Причина в том, что даже в собственном примере приложения Google (см. Изображение) он не пытается установить это иинициирует инициализацию, даже если рабочий профиль уже существует, а приложение фактически является владельцем!

Ответы [ 2 ]

0 голосов
/ 14 мая 2019
  1. Создайте занятие со специальным фильтром намерений и установите android:enabled="false".Переопределите onCreate, чтобы установить результат, а затем сразу же закончить.
  2. В вашей реализации DeviceAdminReceiver::onProfileProvisioningComplete, включите вашу специальную активность с помощью PackageManager::setComponentEnabledSetting и добавьте фильтр намерений с несколькими профилями, чтобы его можно было вызыватьиз основного профиля.
  3. Когда открывается ваше основное действие:
    1. Если DeviceProfileManager::isProfileOwnerApp возвращает true, вы работаете в своем управляемом профиле.
    2. В противном случае используйте startActivityForResult чтобы начать Intent, который соответствует вашему фильтру намерений.Используйте Intent::setPackage, чтобы гарантировать, что только ваш пакет может ответить на него.
    3. Если startActivityForResult выдает исключение, ваш управляемый профиль не настроен.Если UserManager::getUserProfiles возвращает только один профиль, управляемый профиль не настраивается;в противном случае настраиваемый профиль другого приложения настраивается.
    4. Если настроен ваш управляемый профиль, вы получите вызов onActivityResult, включая все данные, которые вы отправляете себе, например UserHandle для управляемогопрофиль.
0 голосов
/ 15 июня 2018

Рабочий профиль уже настроен на устройстве?
Если так, то мое приложение владеет профилем?Если нет, какое приложение работает?

Этот код будет работать при запуске под основным пользователем.Владельцем профиля для основного пользователя будет рабочий профиль.Он будет регистрировать ваш собственный пакет, если оно принадлежит вашему приложению.

DevicePolicyManager manager =
        (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
List<ComponentName> activeAdmins = manager.getActiveAdmins();
if (activeAdmins != null){
   for (ComponentName admin : activeAdmins){
      String packageName =  admin.getPackageName();
      if (manager.isProfileOwnerApp(packageName)){
          Log.d(TAG, "Work Profile is: " + packageName);
      }
   }
}

Используйте это, если вы просто хотите проверить, является ли ваше приложение владельцем профиля в вашем приложении.

manager.isProfileOwnerApp(getApplicationContext().getPackage());

Активен ли рабочий профиль?

Если isProfileOwnerApp () возвращает true для какого-либо пакета под основным пользователем, рабочий профиль активен и принадлежит этому пакету.

Вторичные пользователитакже может быть обеспечен владельцем профиля на устройстве, которое поддерживает несколько пользователей, но я пока не видел, как это реализовано в EMM.Владелец устройства должен был бы назначить компонент вашего пакета в качестве владельца профиля вторичного пользователя, так что, вероятно, можно с уверенностью сказать, что этого не произойдет.Но если это так, ваше приложение должно работать так же, как рабочий профиль, но в контексте вторичного пользователя в качестве управляемого профиля.

* РЕДАКТИРОВАТЬ (15.06.18) *:
Я протестировал ваш сценарий на устройстве Android O, и у меня не получилось такого же поведения.После предоставления рабочего профиля из TestDPC, TestDPC обнаружил, что управляемый профиль уже был подготовлен, и не позволил мне обеспечить его снова.

Для какой версии Android вы разрабатываете?

Я покопался в TestDPC и нашел некоторый код, модифицированный для вашего сценария, который может вам помочь.К сожалению, для Android M и ниже, TestDPC не обнаружит, что устройству уже был предоставлен рабочий профиль, и просто попытается снова.Кроме того, я не нашел способа определить, кто этот владелец профиля, ваше приложение или другое приложение.Но я надеюсь, что это поможет!

/**
 * @param context Calling activity's context
 * @return true, if work profile provisioning is allowed
 */
@TargetApi(Build.VERSION_CODES.N)
public static boolean isProvisioningAllowed(Context context) {
    if (BuildCompat.isAtLeastN()) {
        DevicePolicyManager dpm = (DevicePolicyManager) context
                .getSystemService(Context.DEVICE_POLICY_SERVICE);
        return dpm.isProvisioningAllowed(ACTION_PROVISION_MANAGED_DEVICE);
    }
    else {
        return true;
    }
}
...