Profils professionnels

La plateforme Android permet aux appareils d’avoir professionnel (parfois appelés profils gérés). Contrôle d'un profil professionnel par un administrateur informatique. Les fonctionnalités disponibles sont définies séparément des fonctionnalités du profil principal de l'utilisateur. Cette approche permet aux entreprises de contrôler l'environnement dans lequel les applications et les données propres à l'entreprise s'exécutent sur l'appareil d'un utilisateur, tout en permettant aux utilisateurs d'utiliser leurs applications et profils personnels.

Cette leçon vous explique comment modifier votre application pour qu'elle fonctionne de manière fiable sur un appareil doté d'un profil professionnel. Vous n'avez rien à faire en plus des bonnes pratiques ordinaires de développement d'applications. Cependant, certains de ces meilleurs outils pratiques deviennent particulièrement importantes sur les appareils dotés de profils professionnels. Ce ce document met en évidence les problèmes dont vous devez être conscient.

Présentation

Les utilisateurs souhaitent souvent utiliser leurs appareils personnels en entreprise. Ce peut présenter un dilemme aux organisations. Si l'utilisateur peut utiliser ses propres l'appareil, l'organisation doit s'inquiéter que les informations confidentielles (comme les informations e-mails et contacts) se trouvent sur un appareil que l'organisation ne contrôle pas.

Pour remédier à cette situation, Android 5.0 (niveau d'API 21) permet aux organisations de : configurer des profils professionnels. Si un appareil est équipé d'un profil professionnel, son sont contrôlés par l'administrateur informatique. La L'administrateur informatique peut choisir les applications autorisées pour ce profil et peut contrôler uniquement les fonctionnalités de l'appareil disponibles pour le profil.

Si un appareil dispose d'un profil professionnel, cela a des conséquences sur les applications s'exécutant sur l'appareil, quel que soit le profil dans lequel elle s'exécute:

  • Par défaut, la plupart des intents ne passent pas d'un profil à l'autre. Si un l'application exécutée sur le profil déclenche un intent, mais aucun gestionnaire n'est disponible pour l'intent sur ce profil, et l'intent n'est pas autorisé à accéder à l'autre profil en raison des restrictions du profil, la requête échoue et l'application peut s'arrêter. de manière inattendue.
  • L'administrateur informatique du profil peut limiter les applications système disponibles sur le profil professionnel. Cette restriction peut également entraîner l'absence de gestionnaire pour des intents courants dans le profil professionnel.
  • Étant donné que les profils personnel et professionnel disposent d'espaces de stockage distincts, qui est valide sur un profil ne l'est pas sur l'autre. N'importe quelle valeur l'intent déclenché sur un profil peut être géré sur l'autre (selon le profil ), il n'est donc pas prudent d'associer des URI de fichier à des intents.

Empêcher l'échec des intents

Sur un appareil doté d'un profil professionnel, des restrictions s'appliquent au fait que les intents peuvent passer d'un profil à un autre. Dans la plupart des cas, lorsqu'un intent est déclenché, désactivé, il est géré sur le même profil que celui où il est déclenché. S'il n'existe aucun gestionnaire de l'intent sur ce profil, il n'est pas géré, et l'application qui l'a déclenchée peut s'arrêter de manière inattendue, même s'il existe un gestionnaire l'intention sur l'autre profil.

L'administrateur du profil peut choisir les intents autorisé à passer d'un profil à un autre. Puisque l'administrateur informatique cette décision, vous n'avez aucun moyen de savoir à l'avance quels intents sont autorisés à traverser cette limite. La L'administrateur informatique définit cette règle et est libre de la modifier à tout moment.

Avant que votre application démarre une activité, vous devez vérifier qu'une la bonne résolution. Toi vous pouvez vérifier qu'une résolution est acceptable en appelant Intent.resolveActivity(). S'il n'y a pas de moyen de résoudre l'intent, la méthode renvoie null Si la méthode renvoie une valeur non nulle, il existe au moins une manière de résoudre l'intent et de le déclencher sans risque. Dans ce cas, l'intent peut être résolu soit parce qu'il y a un gestionnaire sur le profil actuel, soit parce que l'intent est est autorisé à accéder à un gestionnaire de l'autre profil. (Pour en savoir plus sur résoudre des intents, consultez la section Intents courants.)

Par exemple, si votre application doit régler des minuteurs, elle doit vérifier que il existe un gestionnaire valide pour l'intent ACTION_SET_TIMER. Si l'application ne parvient pas à se résoudre l'intent, il doit prendre l'action appropriée (par exemple, afficher une erreur ).

Kotlin

fun startTimer(message: String, seconds: Int) {

    // Build the "set timer" intent
    val timerIntent = Intent(AlarmClock.ACTION_SET_TIMER).apply {
        putExtra(AlarmClock.EXTRA_MESSAGE, message)
        putExtra(AlarmClock.EXTRA_LENGTH, seconds)
        putExtra(AlarmClock.EXTRA_SKIP_UI, true)
    }

    // Check if there's a handler for the intent
    if (timerIntent.resolveActivity(packageManager) == null) {

        // Can't resolve the intent! Fail this operation cleanly
        // (perhaps by showing an error message)

    } else {
        // Intent resolves, it's safe to fire it off
        startActivity(timerIntent)

    }
}

Java

public void startTimer(String message, int seconds) {

    // Build the "set timer" intent
    Intent timerIntent = new Intent(AlarmClock.ACTION_SET_TIMER)
            .putExtra(AlarmClock.EXTRA_MESSAGE, message)
            .putExtra(AlarmClock.EXTRA_LENGTH, seconds)
            .putExtra(AlarmClock.EXTRA_SKIP_UI, true);

    // Check if there's a handler for the intent
    if (timerIntent.resolveActivity(getPackageManager()) == null) {

        // Can't resolve the intent! Fail this operation cleanly
        // (perhaps by showing an error message)

    } else {
        // Intent resolves, it's safe to fire it off
        startActivity(timerIntent);

    }
}

Partager des fichiers entre différents profils

Parfois, une application doit permettre à d'autres applications d'accéder à ses propres fichiers. Par exemple, une application de galerie d'images peut souhaiter partager ses images éditeurs. Habituellement, il existe deux façons de partager un fichier: avec un fichier URI ou un URI de contenu.

Un URI de fichier commence par le préfixe file:, suivi du chemin absolu du fichier dans l'espace de stockage de l'appareil. Toutefois, comme le le profil professionnel et le profil personnel utilisent des espaces de stockage distincts, un URI de fichier valide sur un profil ne l'est pas sur l'autre. Cette situation signifie que si vous associer un URI de fichier à un intent ; l'intent est géré sur l'autre profil ; le gestionnaire ne peut pas accéder au fichier.

Partagez plutôt des fichiers avec des URI de contenu. URI de contenu identifier le fichier d'une manière plus sûre et plus partageable. L'URI de contenu contient le chemin d'accès au fichier, mais aussi l'autorité qui fournit le fichier et un numéro d'identification en identifiant le fichier. Vous pouvez générer un identifiant de contenu pour n'importe quel fichier à l'aide d'un FileProvider Vous pouvez ensuite partager ce contenu ID à d'autres applications (même sur l'autre profil). Le destinataire peut utiliser Content ID pour accéder au fichier en question.

Par exemple, voici comment obtenir l'URI de contenu d'un fichier spécifique URI:

Kotlin

// Open File object from its file URI
val fileToShare = File(fileUriToShare)

val contentUriToShare: Uri = FileProvider.getUriForFile(
        context,
        "com.example.myapp.fileprovider",
        fileToShare
)

Java

// Open File object from its file URI
File fileToShare = new File(fileUriToShare);

Uri contentUriToShare = FileProvider.getUriForFile(getContext(),
        "com.example.myapp.fileprovider", fileToShare);

Lorsque vous appelez la méthode getUriForFile(), vous devez inclure l’autorité du fournisseur du fichier (dans cet exemple, "com.example.myapp.fileprovider"), spécifié dans <provider> du fichier manifeste de votre application. Pour en savoir plus sur le partage de fichiers avec des URI de contenu, consultez Partage Fichiers.

Écouter les notifications

Une application fournit généralement NotificationListenerService pour recevoir des rappels du système concernant les modifications apportées aux notifications. Appareils avec Les profils professionnels peuvent avoir une incidence sur le fonctionnement de NotificationListenerService avec votre application.

Dans un profil professionnel

Vous ne pouvez pas utiliser de NotificationListenerService depuis une appli en cours d'exécution dans le profil professionnel. Lorsque votre application s'exécute dans un profil professionnel, système ignore le NotificationListenerService de votre appli. Toutefois, les applications exécutées dans le profil personnel peuvent écouter les notifications.

Dans un profil personnel

Lorsque votre application s'exécute dans le profil personnel, il est possible que vous ne receviez pas de notifications pour les applications exécutées dans le profil professionnel. Par défaut, toutes les applications du profil personnel recevoir des rappels, mais un administrateur informatique peut ajouter un ou plusieurs profils personnels à la liste d'autorisation applications qu'ils autorisent à écouter les modifications des notifications. Le système bloque ensuite les applications non autorisées. Sur Android 8.0 (niveau d'API 26) ou version ultérieure, une règle d'un contrôleur (DPC) qui gère un profil professionnel peut empêcher votre appli d'écouter aux notifications du profil professionnel à l'aide de l'DevicePolicyManager méthode setPermittedCrossProfileNotificationListeners() Votre application reçoit toujours des rappels pour les notifications publiées sur la page profil.

Tester la compatibilité de votre application avec les profils professionnels

Vous devez tester votre application dans un environnement de profil professionnel pour : détecter les problèmes qui entraîneraient l'échec de votre application sur un appareil avec les profils professionnels. En particulier, les tests sur un appareil de profil professionnel pour vous assurer que votre application gère les intents correctement, et non au déclenchement d'intents qui ne peuvent pas être gérées, ni d'associer des URI qui ne fonctionnent pas dans tous les profils, activé.

Nous avons fourni une application exemple, TestDPC, que vous pouvez utiliser pour configurer un profil professionnel sur un appareil Android exécutant Android 5.0 (niveau d'API 21) ou version ultérieure Cette application vous offre un moyen simple de tester votre application dans un environnement de profil professionnel. Vous pouvez également utiliser cette application pour configurez le profil professionnel comme suit:

  • Spécifiez les applications par défaut disponibles sur l'appareil géré profil
  • Configurez les intents autorisés à passer d'un profil à un autre l'autre

Si vous installez manuellement une application sur un appareil doté d'un câble USB profil professionnel, l'application est installée à la fois sur les appareils personnels et professionnels profil. Une fois l'application installée, vous pouvez la tester dans la section les conditions suivantes:

  • Si un intent est normalement géré par une application par défaut (par exemple, l'application Appareil photo), essayez de désactiver l'application par défaut dans le profil professionnel, et vérifiez que l'application gère cela de manière appropriée.
  • Si vous déclenchez un intent en s'attendant à ce qu'il soit géré par une autre application, essayez en activant et en désactivant l'autorisation de passer d'un profil à l'autre une autre. Vérifiez que l'application se comporte correctement dans les deux cas. Si le n'est pas autorisé à passer d'un profil à l'autre, vérifiez que le comportement de l'application lorsqu'il existe ou non un gestionnaire approprié dans le profil de l'application. Par exemple, si votre application déclenche un intent lié à une carte, essayez chacune des méthodes suivantes scénarios: <ph type="x-smartling-placeholder">
      </ph>
    • L'appareil permet aux intents cartographiques de passer d'un profil à l'autre. un gestionnaire approprié est présent sur l'autre profil (le profil auquel l'application n'est pas en cours d'exécution)
    • L'appareil ne permet pas aux intents cartographiques de passer d'un profil à un autre, mais est un gestionnaire approprié dans le profil de l'application ;
    • L'appareil ne permet pas aux intents cartographiques de passer d'un profil à un autre. n'est pas un gestionnaire adapté aux intents de carte sur le profil de l'appareil
  • Si vous joignez du contenu à un intent, vérifiez qu'il se comporte correctement à la fois lorsqu'elles sont gérées dans le profil de l'application et lorsqu'elles se croisent profils.

Conseils et astuces pour effectuer des tests sur les profils professionnels

Quelques astuces qui pourraient vous être utiles pour tester appareil de profil professionnel.

  • Comme indiqué, lorsque vous chargez une application indépendamment sur un appareil doté d'un profil professionnel, installé sur les deux profils. Si vous le souhaitez, vous pouvez supprimer l'application d'un profil. et laissez-le sur l'autre.
  • La plupart des commandes du gestionnaire d'activités disponibles dans le shell Android Debug Bridge (adb) acceptent l'indicateur --user, qui vous permet de spécifier l'utilisateur à exécuter . En spécifiant un utilisateur, vous pouvez choisir de l'exécuter en tant qu'utilisateur principal non géré ou le profil professionnel. Pour en savoir plus, consultez ADB Commandes shell.
  • Pour rechercher les utilisateurs actifs sur un appareil, utilisez le gestionnaire de packages adb list users. Le premier nombre de la chaîne de sortie est le que vous pouvez utiliser avec l'option --user. Pour plus consultez ADB Shell Commandes.

Par exemple, pour trouver les utilisateurs d'un appareil, vous devez exécuter la commande suivante:

$ adb shell pm list users
UserInfo{0:Drew:13} running
UserInfo{10:Work profile:30} running

Dans ce cas, l'utilisateur principal ("Drew") possède l'identifiant 0 et l'identifiant profil professionnel a l'ID utilisateur 10. Pour exécuter une application dans le profil professionnel, vous devez : utiliseriez une commande comme celle-ci:

$ adb shell am start --user 10 \
-n "com.example.myapp/com.example.myapp.testactivity" \
-a android.intent.action.MAIN -c android.intent.category.LAUNCHER