Netzwerke und Telefonie

Die Funktionen in diesem Leitfaden beschreiben die Netzwerk- und Telefonieverwaltung. Funktionen, die Sie in Ihren Geräterichtlinien implementieren können Controller App (DPC). Dieses Dokument enthält Code Beispiele und Sie können auch die Test- DPC-App als Quelle des Beispielcodes für Android-Unternehmensfunktionen.

Eine DPC-App kann im Modus „Profilinhaber“ auf privaten Geräten oder im Geräteeigentümer ausgeführt werden auf vollständig verwalteten Geräten. In dieser Tabelle sehen Sie, welche Funktionen verfügbar, wenn der DPC im Modus „Profilinhaber“ oder „Geräteinhaber“ ausgeführt wird Modus:

Funktion Profilinhaber Geräteeigentümer
Auf geschäftliche Kontakte zugreifen Profilübergreifend
Achten Sie darauf, sichere Netzwerkverbindung für den geschäftlichen Traffic
Richten Sie ein eine WLAN-Netzwerk-ID für alle Regionen
Geben Sie ein Separates Telefon für das Arbeitsprofil

Profilübergreifend auf berufliche Kontakte zugreifen

EMM-Anbieter können dem privaten Profil eines Nutzers erlauben, auf seine geschäftlichen Kontakte zuzugreifen, die privaten und beruflichen Kontakte der Nutzenden über die lokale Suche und Remoteverzeichnis-Suche. Auf privaten Geräten kann im privaten Bereich Profil können sowohl private als auch geschäftliche Anrufe tätigen und empfangen. Außerdem Arbeitskontakte gut in die System-UI integriert sind. Wenn das Arbeitsprofil verschlüsselt sind, sind die Daten nicht für das private Profil verfügbar.

In die System-UI integriert

Eingehende geschäftliche Anrufe werden in der System-UI durch ein Aktentaschensymbol gekennzeichnet. Die callLog zeigt auch die , um eingehende und ausgehende geschäftliche Anrufe zu kennzeichnen. Die persönliche Telefon-App und Kontakt-Apps können die Anrufer-ID eines geschäftlichen Kontakts über eine Fernbedienung anzeigen nach Verzeichnis suchen. Der Kontakt muss also nicht bereits auf dem auf einem lokalen Gerät. Die Messaging-App kann lokale Anrufer-IDs und Suchanfragen ausführen.

Die Android-Kompatibilitätsdefinition Das Dokument (CDD) enthält Anforderungen. für geschäftliche Kontakte, die im Standard-Telefon angezeigt werden, sowie die Anforderungen, Kontakte und Messaging-Apps sind durch ein Logo gekennzeichnet zu erstellen.

Arbeitskontakte sind zugänglich und suchbar

Der Nutzer kann über sein privates Profil auf geschäftliche Kontakte zugreifen und diese anrufen. auf dem Suchbildschirm der Telefon-App angezeigt. Der Nutzer kann nach der Arbeit suchen (automatische Vervollständigung) der Kontakte, die lokal mit dem Gerät synchronisiert werden per Remoteverzeichnis-Suche.

Geschäftliche Kontakte im primären Profil verwalten

Der DPC steuert die Berechtigung zum Suchen nach geschäftlichen Kontakten. Wird in Profilinhaber ausgeführt verwaltet der DPC die Sichtbarkeit der geschäftlichen Kontakte im privaten Profil. Weitere Informationen finden Sie unter Geräterichtlinie erstellen Controller

Die Suche nach geschäftlichen Kontakten über das private Profil ist standardmäßig aktiviert.

Sichere Netzwerkverbindung für den geschäftlichen Datenverkehr gewährleisten

Ausführung im Modus „Geräteinhaber“ oder „Profilinhaber“, eine Geräterichtlinie kann der Controller eine immer aktive VPN-Verbindung (Virtual Private Network) verwenden, um Anwendungen zwingen, Traffic über eine bestimmte VPN-App zu leiten, die nicht umgangen werden. Über eine durchgehend aktive VPN-Verbindung kann der DPC sicherstellen, Der Traffic von einem Arbeitsprofil oder einem verwalteten Gerät läuft über einen VPN-Dienst und ohne Eingriff der Nutzenden. Dadurch wird eine sichere Netzwerkverbindung für kontinuierlicher Verkehr innerhalb eines Arbeitsprofils.

Informationen zu durchgehend aktiven VPN-Verbindungen

Als Teil des System-Frameworks wird das VPN-Routing automatisch verwaltet, sodass Nutzer kann den VPN-Dienst nicht umgehen. Wenn der VPN-Dienst getrennt wird, während gesperrt ist, kann kein Datenverkehr ins offene Internet gelangen. Für Apps wird implementiert VpnService, durchgehend aktives VPN bietet ein Framework für die Verwaltung einer sicheren VPN-Verbindung über einen vertrauenswürdigen Server zu erhalten und ihn am Laufen zu halten. Der VPN-Dienst startet die App-Updates unabhängig davon, ob die Verbindung über WLAN oder Mobilfunk. Und wenn das Gerät neu gestartet wird, startet das Framework die VPN-Verbindung neu.

Die Verbindung zum VPN-Dienst ist für den Nutzer transparent. Für eine ein unternehmenseigenes Gerät verwenden, muss der Nutzer nicht in einem Dialog zur Einholung VPN im Always-On-Modus. Über die VPN-Netzwerkeinstellungen des Nutzers kann ein Always-on-Verbindung manuell aktivieren.

Wenn DISALLOW_CONFIG_VPN true lautet, kann der Nutzer das VPN nicht konfigurieren. Aktivieren DISALLOW_DEBUGGING_FEATURES , um zu verhindern, dass Nutzer das durchgehend aktive VPN mit dem Befehl „adb debug“ überschreiben. Um zu verhindern, dass ein Nutzer das VPN deinstalliert, rufen Sie DevicePolicyManager.setUninstallBlocked

VPN-Dienst einrichten

Die Organisation, die Ihre Unternehmenslösung für Android verwendet, richtet das VPN ein.

  1. VPN-App installieren, die VpnService Sie können aktive VPN-Dienste finden, indem Sie einen Intent-Filter verwenden, der den Aktion VpnService.SERVICE_INTERFACE
  2. Deklarieren Sie eine VpnService im Manifest der App durch die Berechtigung geschützt BIND_VPN_SERVICE.
  3. Konfigurieren Sie die VpnService also wird es vom System gestartet. Stellen Sie die VPN-App nicht so ein, dass sie sich selbst startet. Systemstarts überwacht und der eigene Lebenszyklus gesteuert wird.
  4. Legen Sie den Wert für verwaltete Konfigurationen für der VPN-App (siehe Beispiel unten)

Durchgehend aktive VPN-Verbindung aktivieren

Der DPC kann eine durchgehend aktive VPN-Verbindung über eine bestimmte App konfigurieren, Anrufen DevicePolicyManager.setAlwaysOnVpnPackage()

Diese Verbindung wird automatisch hergestellt und bleibt nach einem Neustart bestehen. Wenn lockdownEnabled auf „false“ gesetzt ist, ist der Netzwerkverkehr ab dem Zeitpunkt das Smartphone neu startet und die VPN-Verbindung hergestellt wird. Dies ist nützlich, wenn Sie die Netzwerkverbindung, wenn das VPN ausfällt oder wenn das VPN nicht unbedingt erforderlich ist.

Dauerhafte VPN-Verbindung prüfen

Der DPC kann den Namen des Pakets lesen, das ein durchgehend aktives VPN verwaltet Verbindung für den aktuellen Nutzer mit DevicePolicyManager.getAlwaysOnVpnPackage().

Wenn kein solches Paket vorhanden ist oder das VPN in den Systemeinstellungen erstellt wurde App wird null zurückgegeben.

Beispiel

In der TestDPC App verwendet AlwaysOnVpnFragment.java diese APIs, um die Einstellung für eine durchgehend aktive VPN-Verbindung zu aktivieren.

Im folgenden Beispiel:

  • Die verwalteten Konfigurationen der VPN-Dienste werden vom DevicePolicyManager mit seinen setApplicationRestrictions() .
  • Verwaltete Konfigurationen verwenden beliebige Schlüssel/Wert-Paare und diese Beispiel-App verwendet sie an anderer Stelle, um die Netzwerkeinstellungen des VPN zu konfigurieren (siehe Verwaltete Konfigurationen prüfen.
  • In diesem Beispiel wird das Android-Paketinstallationsprogramm einer Sperrliste hinzugefügt, Systempakete über VPN aktualisieren. Der gesamte Netzwerkverkehr des Nutzers innerhalb Das Arbeitsprofil oder das Gerät durchläuft diese VPN-App, mit Ausnahme des Pakets Installationsprogramm; Die Updates nutzen das offene Internet.
  • DevicePolicyManager aktiviert dann die durchgehend aktive VPN-Verbindung für das VPN-Paket mit setAlwaysOnVpnPackage(), und Aktivieren des Sperrmodus.

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(...);
}

Eine einzelne WLAN-ID für mehrere Regionen einrichten

Ausführung im Modus „Geräteinhaber“ oder „Profilinhaber“, eine Geräterichtlinie Controller (DPC) kann mehrere Zertifikate einer Zertifizierungsstelle (Certificate Authority, CA) verknüpfen mit einer einzigen WLAN-Konfiguration. Mit dieser Konfiguration kann ein Gerät sich mit WLAN-Zugangspunkten mit demselben Netzwerknamen verbinden kann oder Service Set Identifier (SSID), die jedoch mit einer anderen Zertifizierungsstelle konfiguriert sind Zertifikate. Dies ist nützlich, wenn die drahtlosen Netzwerke Ihrer Organisation die sich in mehreren geografischen Regionen befinden. Für jede Region ist ein anderes Zertifizierungsstelle. Für rechtsgültige Unterschriften kann z. B. eine lokale die eine regionale Zertifizierungsstelle benötigt.

Hinweis: Android unterstützt setCaCertificate seit API 18 (Jelly Bean), aber IT-Administratoren müssen ihre Netzwerke bereitstellen separat mit jeder Zertifizierungsstelle, damit die Geräte bei jeder Zertifizierungsstelle nahtlos authentifiziert werden können und zwar unabhängig von der Region.

CA-Zertifikate zur Identifizierung des Servers angeben

Um eine Liste von X.509-Zertifikaten anzugeben, die den Server mit denselben Zertifikaten identifizieren SSID: Fügen Sie alle relevanten Zertifizierungsstellen mithilfe von WifiEnterpriseConfig.setCaCertificates() in die WLAN-Konfiguration ein.

Ein Serverzertifikat ist gültig, wenn seine Zertifizierungsstelle mit einem der angegebenen Zertifikate übereinstimmt. Standardnamen werden den Zertifikaten automatisch zugewiesen und im Konfiguration. Die WifiManager installiert das Zertifikat und speichert die Konfiguration automatisch, wenn Netzwerk aktiviert ist, und entfernt das Zertifikat, wenn die Konfiguration gelöscht.

Um alle CA-Zertifikate abzurufen, die mit der WLAN-Konfiguration verknüpft sind, verwenden Sie WifiEnterpriseConfig.getCaCertificates(), um eine Liste mit X509Certificate-Objekte.

WLAN-Konfiguration mit mehreren CA-Zertifikaten hinzufügen

  1. Überprüfen Sie die Identität des Servers: <ph type="x-smartling-placeholder">
      </ph>
    1. Laden Sie die X.509-CA-Zertifikate.
    2. Den privaten Schlüssel und das Zertifikat des Clients laden. Ein Beispiel für das Lesen einer Zertifikatsdatei finden Sie unter Sicherheit mit HTTPS und SSL.
  2. Erstellen Sie ein neues WifiConfiguration und die SSID und die Schlüsselverwaltung festlegen.
  3. Richten Sie den WifiEnterpriseConfig Instanz auf diesem WifiConfiguration.
    1. Identifizieren Sie den Server anhand einer Liste von X509Certificate mit setCaCertificates().
    2. Legen Sie die Anmeldedaten, die Identität und das Passwort des Clients fest.
    3. Legen Sie für das erweiterbare Authentifizierungsprotokoll (Extensible Authentication Protocol, EAP) und die Methode der Phase 2 Folgendes fest: Verbindung herstellen.
  4. Fügen Sie das Netzwerk mit der WifiManager
  5. Aktivieren Sie das Netzwerk. WifiManager speichert die Konfiguration automatisch während einrichten.

In diesem Beispiel werden die Schritte zusammengefasst:

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

Separates Telefon für das Arbeitsprofil festlegen

Sie können eine separate Telefon-App zur Verwendung in einem Arbeitsprofil auf die Zulassungsliste setzen. Das kann das Telefon selbst oder eine Voice-over-IP-App (VoIP), die die Funktion ConnectionService API für das aufrufende Back-End. Dies bietet dasselbe integrierte System-UI-Dialogfeld, Erfahrung mit VoIP-Anwendungen im Arbeitsprofil, sodass die Arbeit eine Hauptfunktion ist. Eingehende Anrufe an die geschäftlichen Anrufkonten werden zwischen eingehenden Anrufen und privaten Anrufkonten unterscheiden.

Der Nutzer kann festlegen, ob er Anrufe über die geschäftliche Telefon App auf der Zulassungsliste tätigen und annehmen möchte über ein Telefonkonto. Alle von diesem Telefon getätigten oder bei der Arbeit eingehenden Anrufe Telefonkonto, werden im Arbeitsprofil im CallLog Dienstanbieter. Die Telefonfunktion für die Arbeit führt eine reine dienstliche Anrufliste, die nur Zugriff auf beruflichen Kontakte. Eingehende Anrufe über einen Netzwerkschalter werden vom primären Dialer verarbeitet und in einer persönlichen Anrufliste gespeichert. Wenn ein Arbeitsprofil gelöscht wird, die mit diesem Arbeitsprofil verknüpft sind, sowie alle zugehörigen Daten.

Bei Drittanbieter-Apps muss ConnectionService implementiert werden

VoIP-Apps von Drittanbietern, die Anrufe tätigen müssen die in die integrierte Telefon-App integriert sind, ConnectionService der API erstellen. Dies ist für alle VoIP-Dienste erforderlich, die für geschäftliche Anrufe verwendet werden. Diese Apps profitieren davon, wenn ihre Anrufe wie herkömmliche Mobilfunkanrufe behandelt werden, z. B. in der integrierten Telefonfunktion und in der Anrufliste angezeigt. Wenn die App-Implementierung ConnectionService im Arbeitsprofil installiert ist, kann nur ein Dialer darauf zugreifen. die in diesem Arbeitsprofil installiert sind.

Sobald der Entwickler die ConnectionService, sollte er es zur Manifest-Datei der App hinzufügen und eine PhoneAccount mit dem TelecomManager Ein Telefonkonto stellt eine bestimmte Methode dar, um Telefonanrufe zu tätigen oder zu empfangen. und es können mehrere PhoneAccounts für jede ConnectionService. Nach der Registrierung des Telefonkontos können Sie sie über die Telefoneinstellungen aktivieren.

Integration der System-UI und Benachrichtigungen

Die System-UI bietet Nutzern eine einheitliche und integrierte Anruffunktion. für Drittanbieter-Apps, die den ConnectionService API als Back-End verwenden, um Aufrufe zu tätigen. Bei Verwendung der App in einem Arbeitsprofil: eine Aktentasche wird bei eingehenden Anrufen und in der Statusleiste angezeigt. Eine App, die ein ConnectionService, die im Arbeitsprofil installiert ist, kann den System-Dialer an oder erstellen Sie eine separate Telefonanwendung für die Arbeit. Dabei kann es sich um eine einzelne App oder zu trennen.

Die Telefon-App stellt fest, ob ein geschäftlicher Anruf getätigt oder empfangen wird, indem sie der Flagge suchen android.telecom.Call.Details.PROPERTY_ENTERPRISE_CALL Wenn es sich um einen geschäftlichen Anruf handelt, wird dies dem Nutzer durch das Telefon durch Hinzufügen eines Arbeitsausweis (Aktentaschensymbol):

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
}