Detecção de perfil de trabalho

Este guia ilustra como detectar um perfil de trabalho em um dispositivo. Ela se aplica apenas a perfis de trabalho gerenciados pelo app Android Device Policy.

Detectar se o app está sendo executado em um perfil de trabalho

O método abaixo verifica se o app de chamada está em execução em um perfil de trabalho gerenciado pelo app Android Device Policy.

fun isInsideWorkProfile(): Boolean {
  val devicePolicyManager = getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager

  return devicePolicyManager.isProfileOwnerApp("com.google.android.apps.work.clouddpc")
}
boolean isInsideWorkProfile() {
  DevicePolicyManager devicePolicyManager = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);

  return devicePolicyManager.isProfileOwnerApp("com.google.android.apps.work.clouddpc");
}

Detectar se o dispositivo tem um perfil de trabalho

Para determinar se um dispositivo tem um perfil de trabalho gerenciado pelo app Android Device Policy, use o método a seguir. Ele pode ser chamado em qualquer modo de gerenciamento. Em um app no perfil pessoal, a consulta da intent com.google.android.apps.work.clouddpc.ACTION_DETECT_WORK_PROFILE precisa ser resolvida como uma intent entre perfis se um perfil de trabalho gerenciado pelo app Android Device Policy existir. Esse método só vai retornar true quando chamado do perfil pessoal de um dispositivo que tem esse perfil de trabalho.

Android 11 e versões mais recentes:

fun hasWorkProfile(): Boolean {
  val intent = Intent("com.google.android.apps.work.clouddpc.ACTION_DETECT_WORK_PROFILE")
  val activities = context.packageManager.queryIntentActivities(intent, 0)
  return activities.any { it.isCrossProfileIntentForwarderActivity }
}
boolean hasWorkProfile() {
  Intent intent = new Intent("com.google.android.apps.work.clouddpc.ACTION_DETECT_WORK_PROFILE");
  List<ResolveInfo> activities = context.getPackageManager().queryIntentActivities(intent, 0);
  return activities.stream()
        .anyMatch(
            (ResolveInfo resolveInfo) -> {
              return resolveInfo.isCrossProfileIntentForwarderActivity();
            });
}

Antes do Android 11:

fun hasWorkProfile(): Boolean {
  val intent = Intent("com.google.android.apps.work.clouddpc.ACTION_DETECT_WORK_PROFILE")
  val activities = context.packageManager.queryIntentActivities(intent, 0)
  return activities.any { it.activityInfo.name == "com.android.internal.app.ForwardIntentToManagedProfile" }
}
boolean hasWorkProfile() {
  Intent intent = new Intent("com.google.android.apps.work.clouddpc.ACTION_DETECT_WORK_PROFILE");
  List<ResolveInfo> activities = context.getPackageManager().queryIntentActivities(intent, 0);
  return activities.stream()
        .anyMatch(
            (ResolveInfo resolveInfo) -> {
              return resolveInfo.activityInfo.name.equals("com.android.internal.app.ForwardIntentToManagedProfile");
            });
}