Les fonctionnalités de ce guide décrivent la gestion de la mise en réseau et de la téléphonie que vous pouvez implémenter dans vos règles relatives aux appareils de contrôle (DPC). Ce document contient du code exemples. Vous pouvez aussi utiliser la méthode Test l'application DPC en tant que Exemple de code pour les fonctionnalités Android dédiées aux entreprises
Une application DPC peut s'exécuter en mode propriétaire de profil sur des appareils personnels ou en mode propriétaire de l'appareil sur les appareils entièrement gérés. Ce tableau indique les fonctionnalités disponible lorsque l'outil DPC s'exécute en mode propriétaire du profil ou propriétaire de l'appareil mode:
Fonctionnalité | Propriétaire de la fiche | Propriétaire de l'appareil |
Accéder aux contacts professionnels entre les profils | ✓ | |
Assurez-vous qu'un connexion réseau sécurisée pour le trafic professionnel | ✓ | ✓ |
Configurez un ID de réseau sans fil unique entre les régions | ✓ | ✓ |
Indiquez un clavier distinct pour le profil professionnel | ✓ |
Accéder aux contacts professionnels sur tous les profils
Les EMM peuvent autoriser le profil personnel d'un utilisateur à accéder à ses contacts professionnels les contacts personnels et professionnels d'un utilisateur sont accessibles via une recherche locale et dans un répertoire distant. Sur les appareils personnels, un numéroteur unique peut passer et recevoir des appels personnels et professionnels. De plus, les contacts professionnels sont bien intégrés dans l'UI du système. Si le profil professionnel est chiffrées, ses données ne sont pas disponibles pour le profil personnel.
Intégré à l'UI du système
L'UI du système indique les appels professionnels entrants à l'aide d'une icône en forme de mallette. La
callLog
affiche également les
pour désigner les appels professionnels entrants et sortants. Le numéroteur personnel et
les applications de gestion des contacts peuvent afficher le numéro de l'appelant d'un contact professionnel à l'aide d'une télécommande
dans l'annuaire. Il n'est donc pas nécessaire que le contact soit déjà synchronisé sur la
sur votre appareil local. L'application de messagerie peut utiliser l'affichage du numéro de l'appelant local et la recherche.
La définition de compatibilité Android du document (CDD) comprend les exigences pour que les contacts professionnels s'affichent dans le clavier par défaut, et les exigences Les contacts et les applications de chat portent un badge indiquant qu'ils font partie de l'entreprise. profil.
Les contacts professionnels sont accessibles et inclus dans l'index de recherche.
L'utilisateur peut accéder aux contacts professionnels et les appeler à partir de son profil personnel, ce qui sur l'écran de recherche de l'application Téléphone. L'utilisateur peut rechercher un lieu de travail des contacts (à l'aide de la saisie semi-automatique) qui sont synchronisés localement sur l'appareil et listés via une recherche dans un répertoire distant.
Contrôler les contacts professionnels dans le profil principal
Le DPC contrôle l'autorisation de rechercher des contacts professionnels. Exécution en cours chez le propriétaire du profil , le DPC gère la visibilité des contacts professionnels dans le profil personnel. Pour en savoir plus, consultez la section Créer une règle relative aux appareils contrôleur.
La recherche dans les contacts professionnels par profil personnel est activée par défaut.
Pour voir comment la règle est définie, utilisez
DevicePolicyManager.getCrossProfileContactsSearchDisabled()
Pour activer ou désactiver la recherche dans les contacts professionnels à partir du profil personnel, utilisez
DevicePolicyManager.setCrossProfileContactsSearchDisabled()
Garantir une connexion réseau sécurisée pour le trafic professionnel
s'exécutant en mode propriétaire de l'appareil ou en mode propriétaire du profil, peut utiliser une connexion VPN (réseau privé virtuel) toujours activée forcer les applications à transmettre du trafic via une application VPN spécifiée qui ne peut pas être contournées. En utilisant une connexion VPN permanente, le DPC peut garantir que le réseau le trafic provenant d'un profil professionnel ou d'un appareil géré transite par un service VPN ; sans intervention de l'utilisateur. Ce processus crée une connexion réseau sécurisée pour trafic continu dans un profil professionnel.
À propos des connexions VPN permanentes
Dans le cadre du framework système, le routage VPN est automatiquement géré afin que
ne peut pas contourner le service VPN. Si le service VPN est déconnecté
en mode verrouillé, le trafic ne peut pas fuir vers l'Internet ouvert. Pour les applications
implémentation
VpnService
,
Le VPN permanent offre un framework permettant de gérer une connexion VPN sécurisée
un serveur de confiance
et de le maintenir en bon état. Le service VPN redémarre automatiquement
pour toutes les mises à jour de l'application, qu'elle soit connectée au réseau Wi-Fi ou
mobile. Si l'appareil redémarre, le framework redémarre la connexion VPN.
La connexion au service VPN est transparente pour l'utilisateur. Pour une appareil détenu par l'entreprise, l'utilisateur n'est pas tenu de confirmer une boîte de dialogue de recueil du consentement VPN en mode permanent Les paramètres réseau VPN de l'utilisateur permettent d'activer en mode Always-on manuellement.
Si DISALLOW_CONFIG_VPN
est true
, l'utilisateur ne peut pas configurer le VPN. Activer
DISALLOW_DEBUGGING_FEATURES
pour empêcher les utilisateurs d'ignorer le VPN permanent
à l'aide de la commande de débogage adb.
Pour empêcher un utilisateur de désinstaller le VPN, appelez
DevicePolicyManager.setUninstallBlocked
Configurer le service VPN
L'organisation qui utilise votre solution d'entreprise pour Android configure un VPN.
- Installez une application VPN qui implémente
VpnService
Vous pouvez trouver des services VPN actifs en utilisant un filtre d'intent qui correspond au actionVpnService.SERVICE_INTERFACE
- Déclarer un
VpnService
dans le fichier manifeste de l'application protégée par l'autorisationBIND_VPN_SERVICE
- Configurez les
VpnService
pour qu'elles soient lancées par le système. Évitez de configurer l'application VPN pour qu'elle démarre elle-même à écouter le démarrage du système et à contrôler son propre cycle de vie. - Définissez les de configuration pour l'application VPN (voir l'exemple ci-dessous).
Activer la connexion VPN permanente
Le DPC peut configurer une connexion VPN
toujours activée via une application spécifique en
Appel en cours
DevicePolicyManager.setAlwaysOnVpnPackage()
Cette connexion est automatiquement accordée et persiste après un redémarrage. Si
lockdownEnabled
est défini sur "false", il est possible que le trafic réseau ne soit plus sécurisé à partir du moment où
le téléphone redémarre et
le VPN se connecte. C'est utile si vous ne voulez pas interrompre
la connectivité réseau à chaque fois que le VPN
tombe en panne ou si le VPN n'est pas essentiel.
Vérifier la connexion VPN permanente
Le DPC peut lire le nom du package administrant un VPN permanent
pour l'utilisateur actuel avec
DevicePolicyManager.getAlwaysOnVpnPackage().
En l'absence de package, ou si le VPN a été créé dans les paramètres système
app, null
est renvoyé.
Exemple
Dans l'application TestDPC, AlwaysOnVpnFragment.java
utilise ces API pour activer le paramètre de connexion VPN permanente.
Dans l'exemple ci-dessous :
- L'API gérée
des configurations
services VPN sont définis par
DevicePolicyManager
à l'aide de sonsetApplicationRestrictions()
. - Les configurations gérées utilisent des paires clé/valeur arbitraires. Cet exemple d'application les utilise ailleurs pour configurer les paramètres réseau du VPN (voir Vérifier les configurations gérées).
- L'exemple ajoute le programme d'installation du package Android à une liste de blocage afin qu'il ne mettre à jour les packages système sur le VPN. Tout le trafic réseau de l'utilisateur dans le profil professionnel ou l'appareil passent par cette application VPN, programme d'installation ; ses mises à jour utilisent l'Internet ouvert.
- Le
DevicePolicyManager
active ensuite la connexion VPN permanente pour le un package VPN avecsetAlwaysOnVpnPackage()
, et l'activation du mode confiné.
Kotlin
// Set VPN's managed configurations val config = Bundle().apply { putString(Extras.VpnApp.ADDRESS, "192.0.2.0") putString(Extras.VpnApp.IDENTITY, "vpn.account1") putString(Extras.VpnApp.CERTIFICATE, "keystore://auth_certificate") putStringArray(Extras.VpnApp.DENYLIST, arrayOf("com.android.packageinstaller")) } val dpm = getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager val admin = myDeviceAdminReceiver.getComponentName(this) // Name of package to update managed configurations val vpnPackageName = "com.example.vpnservice" // Associate managed configurations with DeviceAdminReceiver dpm.setApplicationRestrictions(admin, vpnPackageName, config) // Enable always-on VPN connection through VPN package try { val lockdownEnabled = true dpm.setAlwaysOnVpnPackage(admin, vpnPackageName, lockdownEnabled) } catch (ex: Exception) { throw PolicyException() }
Java
// Set VPN's managed configurations final Bundle config = new Bundle(); config.putString(Extras.VpnApp.ADDRESS, "192.0.2.0"); config.putString(Extras.VpnApp.IDENTITY, "vpn.account1"); config.putString(Extras.VpnApp.CERTIFICATE, "keystore://auth_certificate"); config.putStringArray(Extras.VpnApp.DENYLIST, new String[]{"com.android.packageinstaller"}); DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); ComponentName admin = myDeviceAdminReceiver.getComponentName(this); // Name of package to update managed configurations final String vpnPackageName = "com.example.vpnservice"; // Associate managed configurations with DeviceAdminReceiver dpm.setApplicationRestrictions(admin, vpnPackageName, config); // Enable always-on VPN connection through VPN package try { boolean lockdownEnabled = true; dpm.setAlwaysOnVpnPackage(admin, vpnPackageName, lockdownEnabled)); } catch (Exception ex) { throw new PolicyException(...); }
Configurer un seul ID de réseau sans fil pour toutes les régions
s'exécutant en mode propriétaire de l'appareil ou en mode propriétaire du profil, le contrôleur (DPC) peut associer plusieurs certificats d'autorité de certification (CA) avec une seule configuration de réseau sans fil. Avec cette configuration, un appareil peuvent se connecter à des points d'accès sans fil ayant le même nom de réseau ; ou identifiant d'ensemble de services (SSID), mais elles sont configurées avec une autorité de certification différente certificats. Cela est utile si les réseaux sans fil de votre organisation situées dans plusieurs régions géographiques, chacune ayant un nom spécifique autorité de certification. Par exemple, les signatures légales peuvent exiger nécessitant une autorité de certification régionale.
Remarque:Android est compatible avec
setCaCertificate
depuis l'API 18 (Jelly Bean), mais les administrateurs informatiques doivent provisionner leurs réseaux
séparément avec chaque autorité de certification pour garantir que les appareils disposent d'une authentification transparente à chaque
point d'accès, quelle que soit leur région.
Spécifier les certificats CA pour identifier le serveur
Pour spécifier une liste de certificats X.509 qui identifient le serveur à l'aide du même
SSID, incluez toutes les autorités de certification pertinentes dans la configuration sans fil à l'aide de WifiEnterpriseConfig.setCaCertificates()
.
Un certificat de serveur est valide si son autorité de certification correspond à l'un des certificats fournis.
Les noms par défaut sont automatiquement attribués aux certificats et utilisés dans les
configuration. La
WifiManager
installe le certificat et enregistre automatiquement la configuration
réseau est activé, et supprime le certificat lorsque la configuration est
supprimés.
Pour obtenir tous les certificats CA associés à la configuration sans fil, utilisez
WifiEnterpriseConfig.getCaCertificates()
pour renvoyer une liste de
Objets X509Certificate
.
Ajouter une configuration sans fil utilisant plusieurs certificats CA
- Vérifiez l'identité du serveur:
<ph type="x-smartling-placeholder">
- </ph>
- Chargez les certificats CA X.509.
- Chargez la clé privée et le certificat du client. Pour obtenir un exemple de lecture d'un fichier de certificat, consultez Sécurité avec HTTPS et SSL.
- Créer un élément
WifiConfiguration
et définir son SSID et sa gestion de clés. - Configurez le
WifiEnterpriseConfig
une instance surWifiConfiguration
.- Identifier le serveur à l'aide d'une liste
X509Certificate
à l'aide d'objetssetCaCertificates()
- Définissez les identifiants, l'identité et le mot de passe du client.
- Définissez le protocole EAP (Extensible Authentication Protocol) et la méthode Phase 2 en tant que une partie de l'établissement de la connexion.
- Identifier le serveur à l'aide d'une liste
- Ajoutez le réseau associé au
WifiManager
- Activez le réseau. WifiManager enregistre automatiquement la configuration configuration.
Cet exemple relie les étapes entre elles:
Kotlin
// Verify the server's identity val caCert0 = getCaCert("cert0.crt") val caCert1 = getCaCert("cert1.crt") val clientKey = getClientKey() val clientCert = getClientCert() // Create Wi-Fi configuration val wifiConfig = WifiConfiguration().apply { SSID = "mynetwork" allowedKeyManagement.set(KeyMgmt.WPA_EAP) allowedKeyManagement.set(KeyMgmt.IEEE8021X) // Set up Wi-Fi enterprise configuration enterpriseConfig.setCaCertificates(arrayOf<X509Certificate>(caCert0, caCert1)) enterpriseConfig.setClientKeyEntry(clientKey, clientCert) enterpriseConfig.setIdentity("myusername") enterpriseConfig.setEapMethod(Eap.TLS) enterpriseConfig.setPhase2Method(Phase2.NONE) } // Add network val wifiManager = getSystemService(Context.WIFI_SERVICE) as WifiManager val netId = wifiManager.addNetwork(wifiConfig) // Enable network if (netId < 0) { // Error creating new network } else { wifiManager.enableNetwork(netId, true) }
Java
// Verify the server's identity X509Certificate caCert0 = getCaCert("cert0.crt"); X509Certificate caCert1 = getCaCert("cert1.crt"); PrivateKey clientKey = getClientKey(); X509Certificate clientCert = getClientCert(); // Create Wi-Fi configuration WifiConfiguration wifiConfig = new WifiConfiguration(); wifiConfig.SSID = "mynetwork"; wifiConfig.allowedKeyManagement.set(KeyMgmt.WPA_EAP); wifiConfig.allowedKeyManagement.set(KeyMgmt.IEEE8021X); // Set up Wi-Fi enterprise configuration wifiConfig.enterpriseConfig.setCaCertificates(new X509Certificate[] {caCert0, caCert1}); wifiConfig.enterpriseConfig.setClientKeyEntry(clientKey, clientCert); wifiConfig.enterpriseConfig.setIdentity("myusername"); wifiConfig.enterpriseConfig.setEapMethod(Eap.TLS); wifiConfig.enterpriseConfig.setPhase2Method(Phase2.NONE); // Add network WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); int netId = wifiManager.addNetwork(wifiConfig); // Enable network if (netId < 0) { // Error creating new network } else { wifiManager.enableNetwork(netId, true); }
Indiquer un clavier distinct pour le profil professionnel
Vous pouvez ajouter une application de téléphonie distincte à la liste d'autorisation à utiliser dans un profil professionnel.
Il peut s'agir du clavier lui-même ou d'une application VoIP (Voice over IP) qui implémente le
ConnectionService
pour le backend appelant. Ainsi, les appels vers l'UI du système sont identiques
aux applications VoIP dans le profil professionnel, ce qui rend le travail
d'appeler une fonctionnalité essentielle. Les appels entrants vers des comptes d'appels professionnels sont
différenciés des appels
entrants vers les comptes d’appel personnels.
L'utilisateur peut choisir de passer et recevoir des appels depuis le clavier professionnel sur liste d'autorisation
sur un compte de téléphone. Tous les appels passés à partir de ce numéroteur ou entrants
compte de téléphone, sont enregistrées dans le
CallLog
un fournisseur de services agréé. Le clavier professionnel conserve un journal d'appels professionnel uniquement avec un accès limité aux
les contacts professionnels. Les appels de commutateur réseau entrants sont gérés par le numéroteur principal.
et stockées dans un journal d'appels personnel. Si un profil professionnel est supprimé, le journal d'appels
associé à ce profil professionnel est également supprimé,
données.
Les applications tierces doivent implémenter ConnectionService
Applications VoIP tierces qui doivent passer et recevoir des appels téléphoniques
dans l'application pour téléphone intégrée peuvent implémenter
ConnectionService
API. Nécessaire pour tous les services VoIP utilisés pour les appels professionnels. Ces applications
s'ils sont traités comme des appels cellulaires traditionnels,
par exemple, elles apparaissent dans le clavier système
intégré et dans le journal d'appels. Si le
implémentation d'une application
ConnectionService
est installé dans le profil professionnel, il n'est accessible que par un clavier,
installé dans ce profil professionnel.
Une fois que le développeur a implémenté
ConnectionService
,
il doit l'ajouter au fichier manifeste de l'application et enregistrer un
PhoneAccount
avec le
TelecomManager
Un compte de téléphone représente une méthode distincte
pour passer ou recevoir des appels téléphoniques,
et il peut y avoir plusieurs PhoneAccounts
pour chaque
ConnectionService
Une fois le compte de téléphone enregistré, l'utilisateur
vous pouvez l'activer via
les paramètres du clavier.
Intégration de l'UI du système et notifications
L'UI du système offre aux utilisateurs une expérience de numérotation cohérente et intégrée
pour les applications tierces qui utilisent le
ConnectionService
en tant que backend pour effectuer des appels. Si vous utilisez l'application dans un profil professionnel, un porte-documents
s'affiche lors des appels entrants et dans la barre d'état. Une application qui implémente
Les fichiers ConnectionService
installés dans le profil professionnel peuvent utiliser
ou construire un numéroteur
professionnel distinct. Il peut s'agir d'une seule application ou
des applications distinctes.
L'application du clavier détermine si elle passe ou reçoit un appel professionnel en
recherche le drapeau
android.telecom.Call.Details.PROPERTY_ENTERPRISE_CALL
S'il s'agit d'un appel professionnel, le clavier l'indique à l'utilisateur en ajoutant un
badge professionnel (icône en forme de porte-documents):
Kotlin
// Call placed through a work phone account. getCurrentCall() is defined by the // dialer. val call = getCurrentCall() if (call.hasProperty(android.telecom.Call.Details.PROPERTY_ENTERPRISE_CALL)) { // Set briefcase icon }
Java
// Call placed through a work phone account. getCurrentCall() is defined by the // dialer. Call call = getCurrentCall(); if (call.hasProperty(android.telecom.Call.Details.PROPERTY_ENTERPRISE_CALL)) { // Set briefcase icon }