Detección del perfil de trabajo

En esta guía, se muestra cómo detectar un perfil de trabajo en un dispositivo. Solo se aplica a los perfiles de trabajo administrados por la app de Android Device Policy.

Cómo detectar si la app se ejecuta en un perfil de trabajo

El siguiente método verifica si la app que realiza la llamada se ejecuta en un perfil de trabajo que administra la app de 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");
}

Cómo detectar si el dispositivo tiene un perfil de trabajo

Para determinar si un dispositivo tiene un perfil de trabajo administrado por la app de Android Device Policy, usa el siguiente método. Se puede llamar a esta función desde cualquier modo de administración. Desde una app en el perfil personal, la consulta del intent com.google.android.apps.work.clouddpc.ACTION_DETECT_WORK_PROFILE debería resolverse como un intent de perfil sincronizado si existe un perfil de trabajo administrado por la app de Android Device Policy. Este método solo mostrará true cuando se llame desde el perfil personal de un dispositivo que tenga ese perfil de trabajo.

Android 11 y versiones posteriores:

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 de 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");
            });
}