Funkcje w tym przewodniku opisują zarządzanie sieciami i telefonami możliwości, które można wdrożyć w zasadach dotyczących urządzeń kontroler (DPC). Ten dokument zawiera kod Możesz też skorzystać z testów DPC przykładowego kodu funkcji biznesowych Androida.
Aplikacja DPC może działać w trybie właściciela profilu na urządzeniach osobistych lub u właściciela urządzenia na w pełni zarządzanych urządzeniach. Ta tabela zawiera informacje o tym, które funkcje są dostępne, gdy DPC działa w trybie właściciela profilu lub właściciela urządzenia tryb:
Funkcja | Właściciel profilu | Właściciel urządzenia |
Dostęp do kontaktów służbowych we wszystkich profilach | ✓ | |
Upewnij się, że bezpieczne połączenie sieciowe na potrzeby ruchu służbowego | ✓ | ✓ |
Skonfiguruj pojedynczy identyfikator sieci bezprzewodowej we wszystkich regionach | ✓ | ✓ |
Podaj oddzielny telefon z profilem służbowym | ✓ |
Dostęp do kontaktów służbowych w różnych profilach
Dostawcy usług EMM mogą zezwolić profilowi osobistemu użytkownika na dostęp do kontaktów służbowych, osobiste i służbowe kontakty użytkownika są dostępne w wynikach wyszukiwania lokalnego do katalogu zdalnego. Na urządzeniach osobistych za pomocą jednego telefonu może nawiązywać i odbierać połączenia osobiste oraz służbowe. Ponadto kontakty służbowe są dobrze zintegrowane z interfejsem systemu. Jeśli profil służbowy to zaszyfrowane dane nie będą dostępne dla profilu osobistego.
Integracja z interfejsem systemowym
UI systemu przedstawia przychodzące połączenia służbowe z ikoną aktówki.
callLog
pokazuje też
do oznaczenia przychodzących i wychodzących połączeń służbowych. Osobisty telefon czy
aplikacje do obsługi kontaktów mogą wyświetlać ID rozmówcy z kontaktu służbowego za pomocą pilota
w katalogu, nie muszą więc być już zsynchronizowane
na urządzeniu lokalnym. Aplikacja do obsługi wiadomości może korzystać z lokalnego identyfikatora rozmówcy i wyszukiwać.
Definicja zgodności z Androidem Dokument (CDD) zawiera wymagania. aby kontakty służbowe były wyświetlane w domyślnym telefonie, oraz wymagania kontakty i komunikatory są oznaczone plakietką informującą, że pochodzą z pracy profil.
Kontakty służbowe są dostępne i można je wyszukiwać
Użytkownik może uzyskiwać dostęp do kontaktów służbowych i dzwonić do nich z profilu osobistego, który pojawią się na ekranie wyszukiwania w aplikacji Telefon. Użytkownik może wyszukać pracę kontakty (za pomocą autouzupełniania), które są synchronizowane lokalnie z urządzeniem i wyświetlane za pomocą zdalnego wyszukiwania katalogu.
Zarządzaj kontaktami służbowymi w profilu głównym
DPC kontroluje uprawnienia do wyszukiwania kontaktów służbowych. Działanie u właściciela profilu DPC zarządza widocznością kontaktów służbowych w profilu osobistym. Więcej informacji znajdziesz w artykule Tworzenie zasad dotyczących urządzeń kontrolerem.
Wyszukiwanie kontaktów służbowych według profilu osobistego jest domyślnie włączone.
Aby zobaczyć, jak skonfigurowana jest zasada, użyj
DevicePolicyManager.getCrossProfileContactsSearchDisabled()
Aby włączyć lub wyłączyć wyszukiwanie kontaktów służbowych według profilu osobistego, użyj funkcji
DevicePolicyManager.setCrossProfileContactsSearchDisabled()
Zadbaj o bezpieczne połączenie sieciowe na potrzeby ruchu służbowego
działające w trybie właściciela urządzenia lub właściciela profilu, zgodnie z zasadami dotyczącymi urządzeń; kontroler może używać stałego połączenia wirtualnej sieci prywatnej (VPN) do wymuszania na aplikacjach przekazywania ruchu przez określoną aplikację VPN, której nie można i ominęło. Przy użyciu stałego połączenia VPN DPC może zagwarantować, że sieć ruch z profilu służbowego lub urządzenia zarządzanego przechodzi przez usługę VPN, bez interwencji użytkownika. Ten proces tworzy bezpieczne połączenie sieciowe dla: i stały ruch w profilu służbowym.
Informacje o zawsze włączonych połączeniach VPN
W ramach platformy systemowej routing VPN jest zarządzany automatycznie, dzięki czemu
użytkownik nie może ominąć usługi VPN. Jeśli usługa VPN jest rozłączona w trybie
w trybie blokady, ruch nie może przeciekać do otwartego internetu. Aplikacje
wdrażanie
VpnService
,
zawsze włączona sieć VPN zapewnia środowisko do zarządzania bezpiecznymi połączeniami VPN
na zaufanym serwerze
i utrzymaniu go. Usługa VPN automatycznie ponownie uruchomi
połączenia między aktualizacjami aplikacji, niezależnie od tego, czy korzystasz z sieci Wi-Fi, czy
sieć komórkową. Jeśli urządzenie uruchomi się ponownie, platforma ponownie uruchomi połączenie VPN.
Połączenie z usługą VPN jest dla użytkownika przejrzyste. Dla należących do firmy użytkowników, nie muszą oni potwierdzać okna z prośbą o zgodę na przetwarzanie danych Sieć VPN w trybie stałym. Ustawienia sieci VPN użytkownika umożliwiają włączenie zawsze włączone połączenie.
Jeśli DISALLOW_CONFIG_VPN
to true
, użytkownik nie może skonfigurować sieci VPN. Włącz
DISALLOW_DEBUGGING_FEATURES
, by uniemożliwić użytkownikom zastępowanie stałej sieci VPN za pomocą polecenia debugowania adb.
Aby uniemożliwić użytkownikowi odinstalowanie sieci VPN, wywołaj połączenie
DevicePolicyManager.setUninstallBlocked
Konfigurowanie usługi VPN
Organizacja, która używa Twojego rozwiązania dla firm na Androida, konfiguruje sieć VPN.
- Zainstaluj aplikację VPN, która udostępnia
VpnService
Aktywne usługi VPN można znaleźć, używając filtra intencji pasującego do argumentu działanieVpnService.SERVICE_INTERFACE
- Zadeklaruj
VpnService
w pliku manifestu aplikacji chronionym przez uprawnieniaBIND_VPN_SERVICE
- Skonfiguruj
VpnService
więc jest uruchamiany przez system. Nie ustawiaj automatycznego uruchamiania aplikacji VPN nasłuchiwania rozruchu systemu i kontrolowania własnego cyklu życia. - Ustaw zarządzane konfiguracji dla aplikację VPN (patrz przykład poniżej).
Włączanie stałego połączenia VPN
DPC może skonfigurować zawsze aktywne połączenie VPN przez konkretną aplikację przez
połączenia
DevicePolicyManager.setAlwaysOnVpnPackage()
To połączenie jest przyznawane automatycznie i jest kontynuowane po ponownym uruchomieniu. Jeśli
lockdownEnabled
ma wartość fałsz, ruch w sieci może być niezabezpieczony od momentu,
telefon uruchomi się ponownie i nawiążesz połączenie z siecią VPN. Przydaje się to, gdy nie chcesz przerywać
połączenia z siecią za każdym razem, gdy nastąpi awaria sieci VPN lub sieć VPN nie jest istotna.
Sprawdzanie stałego połączenia VPN
DPC może odczytać nazwę pakietu administrującego zawsze włączoną siecią VPN
dla bieżącego użytkownika z
DevicePolicyManager.getAlwaysOnVpnPackage().
Jeśli nie ma takiego pakietu lub sieć VPN została utworzona w ustawieniach systemu
, zwracana jest wartość null
.
Przykład
W aplikacji TestDPC AlwaysOnVpnFragment.java
używa tych interfejsów API, aby włączyć ustawienie stałego połączenia VPN.
W tym przykładzie:
-
konfiguracji
Usługi VPN są konfigurowane przez
DevicePolicyManager
za pomocą funkcjisetApplicationRestrictions()
. - Konfiguracje zarządzane używają dowolnych par klucz-wartość i tej przykładowej aplikacji używa ich w innych miejscach do skonfigurowania ustawień sieci VPN (zobacz Sprawdź konfiguracje zarządzane).
- W przykładzie instalator pakietów na Androida został dodany do listy odrzuconych, więc instalator nie jest blokowany aktualizować pakiety systemowe przez VPN. Cały ruch sieciowy użytkownika w witrynie profil służbowy lub urządzenie przechodzą przez tę aplikację VPN (z wyjątkiem pakietu) instalatora; jego aktualizacje wykorzystują otwarty internet.
DevicePolicyManager
włączy wtedy zawsze włączone połączenie VPN dla Pakiet VPN za pomocąsetAlwaysOnVpnPackage()
, i włączenie trybu blokady.
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(...); }
Skonfiguruj jeden identyfikator sieci bezprzewodowej we wszystkich regionach
działające w trybie właściciela urządzenia lub właściciela profilu, zgodnie z zasadami dotyczącymi urządzeń; kontroler (DPC) może powiązać wiele certyfikatów urzędu certyfikacji z jedną konfiguracją sieci bezprzewodowej. Przy tej konfiguracji urządzenie mogą łączyć się z bezprzewodowymi punktami dostępu o tej samej nazwie sieci lub identyfikatora SSID, ale skonfigurowano z innym urzędem certyfikacji certyfikatów. Jest to przydatne, jeśli sieci bezprzewodowe w organizacji są zlokalizowanych w wielu regionach geograficznych, a każdy z nich wymaga innego urzędu certyfikacji. Na przykład podpisy prawne mogą wymagać lokalnego urząd, który wymaga regionalnego urzędu certyfikacji.
Uwaga: Android obsługuje
setCaCertificate
od wersji API 18 (Jelly Bean), ale administratorzy IT muszą udostępnić swoje sieci
oddzielnie z każdym urzędem certyfikacji, aby zapewnić
płynne uwierzytelnianie urządzeń w każdym
niezależnie od regionu.
Określ certyfikaty CA identyfikujące serwer
Aby określić listę certyfikatów X.509, które identyfikują serwer przy użyciu tego samego
Identyfikator SSID, umieść wszystkie odpowiednie urzędy certyfikacji w konfiguracji sieci bezprzewodowej za pomocą WifiEnterpriseConfig.setCaCertificates()
.
Certyfikat serwera jest ważny, jeśli jego urząd certyfikacji odpowiada jednemu z podanych certyfikatów.
Nazwy domyślne są automatycznie przypisywane do certyfikatów i używane w
konfiguracji.
WifiManager
zainstaluje certyfikat i automatycznie zapisze konfigurację, gdy
jest włączona i usuwa certyfikat, gdy konfiguracja jest
Usunięto.
Aby pobrać wszystkie certyfikaty CA powiązane z konfiguracją sieci bezprzewodowej, użyj
WifiEnterpriseConfig.getCaCertificates()
, aby zwrócić listę
X509Certificate
obiektów.
Dodawanie konfiguracji sieci bezprzewodowej przy użyciu wielu certyfikatów CA
- Sprawdź tożsamość serwera:
- Wczytaj certyfikaty CA X.509.
- Wczytaj klucz prywatny i certyfikat klienta. Przykład odczytywania pliku certyfikatu znajdziesz w sekcji Zabezpieczenia HTTPS i SSL.
- Utwórz nowy element
WifiConfiguration
i skonfigurować jego identyfikator SSID oraz zarządzanie kluczami. - Skonfiguruj
WifiEnterpriseConfig
w instancjiWifiConfiguration
.- Wskaż serwer na liście
X509Certificate
obiekty za pomocąsetCaCertificates()
- Ustaw dane logowania, tożsamość i hasło klienta.
- Ustaw protokół Extensible Authentication Protocol (EAP) i metodę Phase 2 jako nawiązywanie kontaktu.
- Wskaż serwer na liście
- Dodaj sieć z parametrem
WifiManager
- Włącz sieć. WifiManager automatycznie zapisuje konfigurację podczas konfiguracji.
Ten przykład łączy te kroki:
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); }
Ustaw osobny telefon na potrzeby profilu służbowego
Możesz dodać do listy dozwolonych oddzielną aplikację telefonu, która ma być używana w profilu służbowym.
Może to być aplikacja telefonu lub aplikacja VoIP (Voice over IP) obsługująca
ConnectionService
Interfejs API backendu wywołującego. Zapewnia to to samo zintegrowane wybieranie w interfejsie systemu
aplikacji VoIP w profilu służbowym,
i telefonować
głównej funkcji. Połączenia przychodzące z kont do połączeń służbowych są
od połączeń przychodzących
na osobiste konta do połączeń.
Użytkownik może wybrać, czy chcesz nawiązywać i odbierać połączenia za pomocą telefonu służbowego na liście dozwolonych
na koncie telefonicznym. wszystkie połączenia nawiązane z tego telefonu lub przychodzące do pracy;
są rejestrowane w profilu służbowym
CallLog
dostawcy usług. Telefon służbowy prowadzi rejestr połączeń przeznaczonych wyłącznie do pracy i ma dostęp wyłącznie do
kontaktów służbowych. Przychodzące połączenia z przełącznikiem obwodu są obsługiwane przez główny telefon
i przechowywane w osobistym rejestrze połączeń. Po usunięciu profilu służbowego zostanie usunięty rejestr połączeń.
powiązany z tym profilem służbowym zostanie też usunięty,
i skalowalnych danych.
Aplikacje innych firm muszą obsługiwać ConnectionService.
aplikacje VoIP innych firm, które muszą wykonywać połączenia telefoniczne i je realizować.
zintegrowana z wbudowaną aplikacją na telefon może implementować
ConnectionService
API. Jest to wymagane w przypadku wszystkich usług VoIP używanych do połączeń służbowych. Te aplikacje
mogą być traktowani jak tradycyjne połączenia komórkowe,
pojawiają się na przykład we wbudowanym telefonie i rejestrze połączeń. Jeśli
wdrażanie aplikacji
ConnectionService
jest zainstalowana w profilu służbowym i tylko przez telefon
zainstalowane w tym profilu służbowym.
Gdy programista wdroży
ConnectionService
,
należy dodać go do pliku manifestu aplikacji i zarejestrować
PhoneAccount
z
TelecomManager
Konto telefoniczne to osobna metoda nawiązywania lub odbierania połączeń telefonicznych,
i dla każdej z nich może być kilka PhoneAccounts
ConnectionService
Po zarejestrowaniu konta telefonu użytkownik
Możesz ją włączyć w ustawieniach telefonu.
Integracja z interfejsem systemu i powiadomienia
Interfejs systemu zapewnia użytkownikom spójny, zintegrowany sposób wybierania numerów
w przypadku aplikacji innych firm, które korzystają z
ConnectionService
API jako backend do wykonywania wywołań. jeśli używasz aplikacji w profilu służbowym,
jest wyświetlana przy połączeniach przychodzących i na pasku stanu. Aplikacja, która stosuje
Aplikacja ConnectionService
zainstalowana w profilu służbowym może używać
telefonu systemowego lub stworzyć osobny telefon służbowy. Może to być jedna aplikacja lub
i osobnych aplikacji.
Aplikacja Telefon określa, czy nawiązuje lub odbiera połączenie służbowe przez
sprawdzanie flagi
android.telecom.Call.Details.PROPERTY_ENTERPRISE_CALL
Jeśli jest to połączenie służbowe, aplikacja telefoniczna poinformuje o tym użytkownika, dodając
plakietka służbowa (ikona aktówki):
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 }