Funkcje omówione w tym przewodniku opisują możliwości zarządzania siecią i telefonią, które możesz wdrożyć w swojej aplikacji kontrolera zasad dotyczących urządzeń (DPC). Ten dokument zawiera przykłady kodu. Możesz też użyć aplikacji Test DPC jako źródła przykładowego kodu do funkcji biznesowych Androida.
Aplikacja DPC może działać w trybie właściciela profilu na urządzeniach osobistych oraz w trybie właściciela urządzenia na urządzeniach w pełni zarządzanych. 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:
Funkcja | Właściciel profilu | Właściciel urządzenia |
Dostęp do kontaktów służbowych w różnych profilach | ✓ | |
Zapewnianie bezpiecznego połączenia sieciowego na potrzeby ruchu służbowego | ✓ | ✓ |
Konfigurowanie jednego identyfikatora sieci bezprzewodowej w różnych regionach | ✓ | ✓ |
Określanie osobnego telefonu w profilu służbowym | ✓ |
Dostęp do kontaktów służbowych w różnych profilach
Usługi EMM mogą zezwolić profilowi osobistemu użytkownika na dostęp do kontaktów służbowych, aby osobiste i służbowe kontakty użytkownika były dostępne podczas wyszukiwania lokalnego i zdalnego wyszukiwania w katalogu. Na urządzeniach osobistych jeden telefon na profilu osobistym może nawiązywać i odbierać połączenia zarówno osobiste, jak i służbowe. Poza tym kontakty służbowe są dobrze zintegrowane z interfejsem systemu. Jeśli profil służbowy jest zaszyfrowany, jego dane nie są dostępne dla profilu osobistego.
Integracja z interfejsem systemu
Interfejs systemu wskazuje przychodzące połączenia służbowe przy użyciu ikony aktówki. callLog
wyświetla też ikonę oznaczającą przychodzące i wychodzące połączenia służbowe. Aplikacje do rozmów osobistych i kontaktów mogą wyświetlać informacje o ID rozmówcy z pracy za pomocą zdalnego wyszukiwania katalogu, więc nie musi on być już zsynchronizowany na urządzeniu lokalnym. Aplikacja do obsługi wiadomości obsługuje lokalne ID rozmówcy i wyszukiwanie.
Dokument z definicją zgodności z Androidem (Android Compatibility Definition Document) zawiera wymagania dotyczące wyświetlania kontaktów służbowych w domyślnym telefonie oraz wymagania, które muszą oznaczać, że aplikacje do obsługi wiadomości i kontaktów są oznaczone plakietką z profilu służbowego.
Kontakty służbowe są dostępne i dostępne do przeszukiwania
Użytkownik może otwierać kontakty służbowe i dzwonić do nich z poziomu profilu osobistego, który jest wyświetlany na ekranie wyszukiwania w aplikacji Telefon. Użytkownik może wyszukiwać kontakty służbowe (korzystając z autouzupełniania), które są synchronizowane lokalnie z urządzeniem i wyświetlane w katalogu zdalnym.
Zarządzaj kontaktami służbowymi w profilu głównym
DPC kontroluje uprawnienia do wyszukiwania kontaktów służbowych. DPC działa w trybie właściciela profilu i zarządza widocznością kontaktów służbowych w profilu osobistym. Więcej informacji znajdziesz w artykule Tworzenie kontrolera zasad dotyczących urządzeń.
Wyszukiwanie kontaktów służbowych według profilu osobistego jest domyślnie włączone.
Aby sprawdzić konfigurację zasady, użyj
DevicePolicyManager.getCrossProfileContactsSearchDisabled()
.Aby włączyć lub wyłączyć wyszukiwanie kontaktów służbowych według profilu osobistego, użyj
DevicePolicyManager.setCrossProfileContactsSearchDisabled()
.
Zapewnienie bezpiecznego połączenia sieciowego na potrzeby ruchu służbowego
Kontroler zasad dotyczących urządzeń, działając w trybie właściciela urządzenia lub właściciela profilu, może używać zawsze włączonego połączenia z wirtualną siecią prywatną (VPN), aby wymuszać przekazywanie ruchu przez aplikacje przez określoną aplikację VPN, której nie można pominąć. Dzięki stałemu połączeniu VPN DPC może sprawić, że ruch sieciowy z profilu służbowego lub urządzenia zarządzanego będzie przechodził przez usługę VPN bez interwencji użytkownika. Ten proces tworzy bezpieczne połączenie sieciowe na potrzeby ciągłego ruchu w profilu służbowym.
Informacje o stałych połączeniach VPN
W ramach struktury systemu routing VPN jest automatycznie zarządzany, aby użytkownik nie mógł ominąć usługi VPN. Jeśli usługa VPN jest odłączona w trybie blokady, ruch nie może wyciec do otwartego internetu. W przypadku aplikacji, w których zaimplementowano VpnService
, stały VPN zapewnia platformę do zarządzania bezpiecznym połączeniem VPN przez zaufany serwer i utrzymaniu go. Usługa VPN automatycznie ponownie uruchamia połączenie po każdej aktualizacji aplikacji, niezależnie od tego, czy połączenie jest łączone przez 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 przejrzyste dla użytkownika. W przypadku urządzenia należącego do firmy użytkownik nie musi potwierdzać okna z prośbą o zgodę na przetwarzanie danych osobowych w przypadku sieci VPN w trybie stałym. Ustawienia sieci VPN użytkownika pozwalają ręcznie włączyć stałe połączenie.
Jeśli DISALLOW_CONFIG_VPN
ma wartość true
, użytkownik nie może konfigurować sieci VPN. Włącz DISALLOW_DEBUGGING_FEATURES
, aby uniemożliwić użytkownikom zastępowanie zawsze włączonej sieci VPN za pomocą polecenia debugowania adb.
Aby uniemożliwić użytkownikowi odinstalowanie sieci VPN, wywołaj DevicePolicyManager.setUninstallBlocked
.
Konfigurowanie usługi VPN
Organizacja, która używa Twojego rozwiązania dla firm na Androida, konfiguruje VPN.
- Zainstaluj aplikację VPN z implementacją
VpnService
. Aktywne usługi VPN możesz znaleźć, używając filtra intencji pasującego do działaniaVpnService.SERVICE_INTERFACE
. - Zadeklaruj
VpnService
w pliku manifestu aplikacji zabezpieczonym przez to uprawnienieBIND_VPN_SERVICE
. - Skonfiguruj
VpnService
w taki sposób, aby uruchamiał się przez system. Nie ustawiaj uruchamiania aplikacji VPN przez nasłuchiwanie rozruchu systemu i kontrolowanie własnego cyklu życia. - Ustaw konfiguracje zarządzane aplikacji VPN (zobacz przykład poniżej).
Włączanie stałego połączenia VPN
DPC może skonfigurować stałe połączenie VPN za pomocą określonej aplikacji, wywołując metodę DevicePolicyManager.setAlwaysOnVpnPackage()
.
To połączenie jest przyznawane automatycznie i nie działa po ponownym uruchomieniu. Jeśli lockdownEnabled
ma wartość false, ruch w sieci może nie być zabezpieczony od momentu ponownego uruchomienia telefonu i nawiązania połączenia przez VPN. Jest to przydatne, gdy nie chcesz zatrzymywać połączenia sieciowego po awarii sieci VPN lub gdy usługa VPN nie jest niezbędna.
Sprawdzanie połączenia ze stałą siecią VPN
DPC może odczytać nazwę pakietu administrującego stałym połączeniem VPN dla bieżącego użytkownika z: DevicePolicyManager.getAlwaysOnVpnPackage().
Jeśli nie ma takiego pakietu lub sieć VPN została utworzona w aplikacji Ustawienia, zwracany jest 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:
- Konfiguracje zarządzane usługi VPN są ustawiane przez metodę
DevicePolicyManager
za pomocą swojej metodysetApplicationRestrictions()
. - Konfiguracje zarządzane używają dowolnych par klucz-wartość, a ta przykładowa aplikacja używa ich w innym miejscu do konfigurowania ustawień sieci VPN (zobacz Sprawdzanie konfiguracji zarządzanych).
- Ten przykład dodaje instalator pakietów na Androida do listy odrzuconych, aby nie aktualizował pakietów systemowych przez VPN. Cały ruch sieciowy użytkownika w profilu służbowym lub na urządzeniu przechodzi przez tę aplikację VPN, z wyjątkiem instalatora pakietów. Jej aktualizacje korzystają z otwartego internetu.
- Następnie
DevicePolicyManager
włącza stałe połączenie VPN dla pakietu VPN za pomocąsetAlwaysOnVpnPackage()
i włącza tryb 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 w różnych regionach
Kontroler zasad dotyczących urządzeń (DPC) działa w trybie właściciela urządzenia lub profilu i może powiązać wiele certyfikatów urzędu certyfikacji z jedną konfiguracją sieci bezprzewodowej. Dzięki tej konfiguracji urządzenie może łączyć się z bezprzewodowymi punktami dostępu o tej samej nazwie sieci lub identyfikatorze SSID, ale ze skonfigurowanymi różnymi certyfikatami CA. Jest to przydatne, gdy sieci bezprzewodowe Twojej organizacji znajdują się w wielu regionach geograficznych, a każdy region wymaga innego urzędu certyfikacji. Na przykład podpisy prawne mogą wymagać organu lokalnego, który potrzebuje regionalnego urzędu certyfikacji.
Uwaga:Android obsługuje
setCaCertificate
interfejs API 18 (Jelly Bean), ale administratorzy IT muszą udostępniać swoje sieci oddzielnie z każdym urzędem certyfikacji, aby zapewnić bezproblemowe uwierzytelnianie urządzeń w każdym punkcie dostępu, niezależnie od regionu.
Określ certyfikaty CA do identyfikacji serwera
Aby określić listę certyfikatów X.509, które identyfikują serwer o tym samym identyfikatorze SSID, dodaj do konfiguracji bezprzewodowej wszystkie odpowiednie urzędy certyfikacji, używając WifiEnterpriseConfig.setCaCertificates()
.
Certyfikat serwera jest ważny, jeśli jego urząd certyfikacji jest zgodny z jednym z podanych certyfikatów.
Nazwy domyślne są automatycznie przypisywane do certyfikatów i używane w konfiguracji. WifiManager
instaluje certyfikat i automatycznie zapisuje konfigurację po włączeniu sieci oraz usuwa certyfikat po usunięciu konfiguracji.
Aby pobrać wszystkie certyfikaty CA powiązane z konfiguracją sieci bezprzewodowej, użyj funkcji WifiEnterpriseConfig.getCaCertificates()
w celu zwrócenia listy obiektów X509Certificate
.
Dodaj konfigurację bezprzewodową przy użyciu wielu certyfikatów CA
- Sprawdź tożsamość serwera:
- Wczytaj certyfikaty CA X.509.
- Wczytaj klucz prywatny i certyfikat klienta. Przykład sposobu odczytu pliku certyfikatu znajdziesz w artykule Zabezpieczenia HTTPS i SSL.
- Utwórz nowy obiekt
WifiConfiguration
i skonfiguruj jego identyfikator SSID oraz zarządzanie kluczami. - Skonfiguruj instancję
WifiEnterpriseConfig
w:WifiConfiguration
.- Zidentyfikuj serwer za pomocą listy obiektów
X509Certificate
za pomocąsetCaCertificates()
. - Skonfiguruj dane logowania, tożsamość i hasło klienta.
- Ustaw protokół Extensible Authentication Protocol (EAP) i fazę 2 jako część nawiązania połączenia.
- Zidentyfikuj serwer za pomocą listy obiektów
- Dodaj sieć z
WifiManager
. - Włącz sieć. WifiManager automatycznie zapisuje konfigurację podczas konfiguracji.
Ten przykład stanowi połączenie tych kroków:
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); }
Określ osobny telefon na potrzeby profilu służbowego
Możesz utworzyć listę dozwolonych aplikacji telefonu, których chcesz używać w profilu służbowym.
Może to być telefon lub aplikacja VoIP, która implementuje interfejs ConnectionService
API na potrzeby backendu wywołującego. Zapewnia to ten sam zintegrowany interfejs do dzwonienia w aplikacjach VoIP w profilu służbowym, co sprawia, że telefon służbowy jest główną funkcją. Połączenia przychodzące na służbowe konta
różnią się od połączeń przychodzących na osobiste konta do połączeń.
Użytkownik może odbierać i nawiązywać połączenia z białego numeru telefonu na liście dozwolonych na koncie telefonicznym. Wszystkie połączenia nawiązywane z tego telefonu lub przychodzące na służbowe konto telefoniczne są nagrywane w usłudze CallLog
profilu służbowego. Telefon służbowy obsługuje rejestr połączeń używany tylko w pracy z dostępem wyłącznie do kontaktów służbowych. Połączenia przychodzące z przełączników obwodu są obsługiwane przez główny telefon i zapisywane w osobistym rejestrze połączeń. Jeśli profil służbowy zostanie usunięty, zostanie usunięty również rejestr połączeń powiązany z tym profilem oraz wszystkie dane z profilu służbowego.
Aplikacje innych firm muszą implementować ConnectionService
Interfejs ConnectionService
API mogą implementować aplikacje VoIP innych firm, które muszą wykonywać połączenia i mają być zintegrowane z wbudowaną aplikacją telefoniczną. Jest to wymagane w przypadku każdej usługi VoIP używanej do połączeń służbowych. Dla tych aplikacji ich połączenia są traktowane jak tradycyjne połączenia komórkowe – na przykład pojawiają się we wbudowanym telefonie i w rejestrze połączeń. Jeśli w profilu służbowym jest zainstalowana aplikacja implementująca ConnectionService
, będzie ona dostępna tylko dla telefonu, który też został w nim zainstalowany.
Po zaimplementowaniu ConnectionService
deweloper powinien dodać go do pliku manifestu aplikacji i zarejestrować właściwość PhoneAccount
z TelecomManager
.
Konto telefoniczne stanowi odrębną metodę nawiązywania i odbierania połączeń, a dla każdej z nich ConnectionService
może występować wiele parametrów PhoneAccounts
. Po zarejestrowaniu konta telefonu użytkownik może je włączyć w ustawieniach telefonu.
Integracja interfejsu systemu i powiadomienia
Interfejs systemu zapewnia użytkownikom spójny i zintegrowany interfejs dzwonienia w aplikacjach innych firm, które korzystają z interfejsu API ConnectionService
jako backendu do wykonywania połączeń. Jeśli używasz aplikacji w profilu służbowym, przy połączeniach przychodzących i na pasku stanu wyświetla się ikona aktówki. Aplikacja korzystająca z funkcji ConnectionService
zainstalowana w profilu służbowym, może używać telefonu systemowego lub utworzyć osobny telefon służbowy. Mogą to być pojedynczą aplikację
lub osobne aplikacje.
Aplikacja telefonu sprawdza, czy nawiązuje lub odbiera połączenie służbowe, sprawdzając flagę android.telecom.Call.Details.PROPERTY_ENTERPRISE_CALL
.
Jeśli chodzi o połączenie służbowe, telefon informuje użytkownika o tym, dodając plakietkę służbową (ikonę 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 }