Réseau et téléphonie

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.

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.

  1. Installez une application VPN qui implémente VpnService Vous pouvez trouver des services VPN actifs en utilisant un filtre d'intent qui correspond au action VpnService.SERVICE_INTERFACE
  2. Déclarer un VpnService dans le fichier manifeste de l'application protégée par l'autorisation BIND_VPN_SERVICE
  3. 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.
  4. 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 son setApplicationRestrictions() .
  • 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 avec setAlwaysOnVpnPackage(), 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

  1. Vérifiez l'identité du serveur: <ph type="x-smartling-placeholder">
      </ph>
    1. Chargez les certificats CA X.509.
    2. 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.
  2. Créer un élément WifiConfiguration et définir son SSID et sa gestion de clés.
  3. Configurez le WifiEnterpriseConfig une instance sur WifiConfiguration.
    1. Identifier le serveur à l'aide d'une liste X509Certificate à l'aide d'objets setCaCertificates()
    2. Définissez les identifiants, l'identité et le mot de passe du client.
    3. 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.
  4. Ajoutez le réseau associé au WifiManager
  5. 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
}