Sieci i telefonia

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.

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.

  1. Zainstaluj aplikację VPN z implementacją VpnService. Aktywne usługi VPN możesz znaleźć, używając filtra intencji pasującego do działania VpnService.SERVICE_INTERFACE.
  2. Zadeklaruj VpnService w pliku manifestu aplikacji zabezpieczonym przez to uprawnienie BIND_VPN_SERVICE.
  3. 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.
  4. 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 metody setApplicationRestrictions().
  • 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

  1. Sprawdź tożsamość serwera:
    1. Wczytaj certyfikaty CA X.509.
    2. Wczytaj klucz prywatny i certyfikat klienta. Przykład sposobu odczytu pliku certyfikatu znajdziesz w artykule Zabezpieczenia HTTPS i SSL.
  2. Utwórz nowy obiekt WifiConfiguration i skonfiguruj jego identyfikator SSID oraz zarządzanie kluczami.
  3. Skonfiguruj instancję WifiEnterpriseConfig w: WifiConfiguration.
    1. Zidentyfikuj serwer za pomocą listy obiektów X509Certificate za pomocą setCaCertificates().
    2. Skonfiguruj dane logowania, tożsamość i hasło klienta.
    3. Ustaw protokół Extensible Authentication Protocol (EAP) i fazę 2 jako część nawiązania połączenia.
  4. Dodaj sieć z WifiManager.
  5. 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 ConnectionServiceAPI 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
}