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