Networking e telefonia

Le funzionalità di questa guida descrivono la gestione del networking e della telefonia che puoi implementare nei criteri relativi ai dispositivi controller (DPC). Questo documento contiene codice esempi e puoi anche utilizzare lo strumento Test app DPC come sorgente del codice campione per le funzionalità aziendali di Android.

Un'app DPC può essere eseguita in modalità proprietario del profilo sui dispositivi personali o nel proprietario del dispositivo su dispositivi completamente gestiti. Questa tabella indica quali funzionalità sono disponibile quando il DPC è eseguito in modalità proprietario profilo o proprietario dispositivo :

Funzionalità Proprietario del profilo Proprietario del dispositivo
Accedi ai contatti di lavoro tra profili
Assicurati che sia connessione di rete sicura per il traffico di lavoro
Imposta un un singolo ID rete wireless per più regioni
Specifica un valore tastiera separata per il profilo di lavoro

Accedi ai contatti di lavoro su più profili

I provider EMM possono consentire al profilo personale di un utente di accedere ai contatti di lavoro per i contatti personali e di lavoro di un utente sono accessibili tramite la ricerca locale e nella directory remota. Sui dispositivi personali, un solo telefono profilo può effettuare e ricevere chiamate personali e di lavoro. Inoltre, contatti di lavoro sono ben integrati nell'interfaccia utente del sistema. Se il profilo di lavoro è criptati, i relativi dati non sono disponibili per il profilo personale.

Integrato con UI di sistema

L'interfaccia utente di sistema indica le chiamate di lavoro in arrivo utilizzando l'icona di una valigetta. La callLog mostra anche per specificare le chiamate di lavoro in entrata e in uscita. L'app Telefono e le app contatti possono visualizzare le informazioni sull'ID chiamante di un contatto di lavoro utilizzando un telecomando directory Lookup, quindi non è necessario che il contatto sia già sincronizzato dispositivo locale. L'app di messaggistica può eseguire l'ID chiamante e la ricerca locali.

La definizione di compatibilità Android Il documento (CDD) include dei requisiti per visualizzare i contatti di lavoro nel telefono predefinito e i requisiti che contatti e app di messaggistica hanno il badge per indicare che provengono dal lavoro profilo.

I contatti di lavoro sono accessibili e disponibili per la ricerca

L'utente può accedere ai contatti di lavoro e chiamarli dal suo profilo personale, nella schermata di ricerca dell'app Telefono. L'utente può cercare lavoro contatti, mediante il completamento automatico, che vengono sincronizzati localmente sul dispositivo ed elencati con una ricerca nella directory remota.

Controlla i contatti di lavoro nel profilo principale

Il DPC controlla l'autorizzazione a cercare nei contatti di lavoro. In esecuzione nel proprietario del profilo , il DPC gestisce la visibilità dei contatti di lavoro nel profilo personale. Per maggiori informazioni, consulta la sezione Creare un criterio relativo ai dispositivi un controller.

La ricerca dei contatti di lavoro in base al profilo personale è abilitata per impostazione predefinita.

Garantisci una connessione di rete sicura per il traffico di lavoro

In esecuzione in modalità proprietario del dispositivo o proprietario del profilo, un criterio relativo ai dispositivi un controller può utilizzare una connessione VPN (Virtual Private Network) sempre attiva forzare le applicazioni a passare il traffico attraverso un'app VPN specificata che non può essere bypassato. Usando una connessione VPN sempre attiva, il DPC può assicurare che la rete il traffico proveniente da un profilo di lavoro o da un dispositivo gestito passa attraverso un servizio VPN; e senza l'intervento dell'utente. Questa procedura crea una connessione di rete protetta traffico continuo all'interno di un profilo di lavoro.

Informazioni sulle connessioni VPN sempre attive

Nell'ambito del framework di sistema, il routing VPN viene gestito automaticamente in modo che l'utente non può bypassare il servizio VPN. Se il servizio VPN è disconnesso mentre è attivo modalità di blocco, il traffico non può passare verso la rete internet aperta. Per applicazioni implementazione VpnService, la VPN sempre attiva fornisce un framework per la gestione di una connessione VPN sicura tramite affidabile e mantenerlo aggiornato. Il servizio VPN riavvia automaticamente connessione tra gli aggiornamenti dell'app, indipendentemente dal fatto che sia stabilita la connessione tramite Wi-Fi o cellulare. Se il dispositivo si riavvia, il framework riavvia la connessione VPN.

La connessione al servizio VPN è trasparente per l'utente. Per un di proprietà dell'azienda, l'utente non deve confermare una finestra di dialogo per il consenso VPN in modalità sempre attiva. Le impostazioni della rete VPN dell'utente consentono di attivare connessione sempre attiva manualmente.

Se DISALLOW_CONFIG_VPN è true, all'utente non è consentito configurare la VPN. Attiva DISALLOW_DEBUGGING_FEATURES per impedire agli utenti di eseguire l'override della VPN sempre attiva utilizzando il comando di debug adb. Per impedire a un utente di disinstallare la VPN, chiama DevicePolicyManager.setUninstallBlocked.

Configurare il servizio VPN

L'organizzazione che utilizza la tua soluzione aziendale per Android configura una VPN.

  1. Installa un'app VPN che implementa VpnService. Puoi trovare i servizi VPN attivi utilizzando un filtro per intent che corrisponde alla azione VpnService.SERVICE_INTERFACE.
  2. Dichiara un VpnService nel manifest dell'app protetto dall'autorizzazione BIND_VPN_SERVICE.
  3. Configura il VpnService in modo che venga avviato dal sistema. Evita di impostare l'app VPN in modo che si avvii automaticamente l'ascolto di un sistema durante l'avvio e il controllo del proprio ciclo di vita.
  4. Imposta lo stato gestito configurazioni di l'app VPN (vedi esempio sotto).

Abilita la connessione VPN sempre attiva

Il DPC può configurare una connessione VPN sempre attiva tramite un'app specifica chiamata DevicePolicyManager.setAlwaysOnVpnPackage().

Questa connessione viene concessa automaticamente e persiste dopo un riavvio. Se lockdownEnabled è falso, il traffico di rete potrebbe non essere protetto dal momento in cui il telefono si riavvia e la VPN si connette. È utile se non vuoi interrompere connettività di rete ogni volta che si verifica un errore della VPN o se la VPN non è essenziale.

Verificare la connessione VPN sempre attiva

Il DPC può leggere il nome del pacchetto che amministra una VPN sempre attiva connessione per l'utente corrente con DevicePolicyManager.getAlwaysOnVpnPackage().

Se il pacchetto non è presente o se la VPN è stata creata nelle impostazioni di sistema app, viene restituito null.

Esempio

Nell'app TestDPC, AlwaysOnVpnFragment.java utilizza queste API per abilitare l'impostazione di una connessione VPN sempre attiva.

Nel seguente esempio:

  • Lo strumento gestito configurazioni I servizi VPN sono impostati DevicePolicyManager utilizzando i suoi setApplicationRestrictions() .
  • Le configurazioni gestite utilizzano coppie chiave-valore arbitrarie e questa app di esempio le utilizza altrove per configurare le impostazioni di rete della VPN (vedi Seleziona Configurazioni gestite).
  • Nell'esempio, il programma di installazione dei pacchetti Android viene aggiunto a una lista bloccata in modo che aggiornare i pacchetti di sistema tramite la VPN. Tutto il traffico di rete dell'utente all'interno il profilo o il dispositivo di lavoro passa attraverso questa app VPN, ad eccezione del pacchetto il programma di installazione; i suoi aggiornamenti usano internet aperte.
  • DevicePolicyManager abilita quindi la connessione VPN sempre attiva per pacchetto VPN utilizzando setAlwaysOnVpnPackage(), e attivare la modalità di blocco.

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

Configura un singolo ID rete wireless tra regioni

In esecuzione in modalità proprietario del dispositivo o proprietario del profilo, un criterio relativo ai dispositivi del controller (DPC) può associare più certificati delle autorità di certificazione (CA) con un'unica configurazione di rete wireless. Con questa configurazione, può connettersi a punti di accesso wireless con lo stesso nome di rete oppure Service Set Identifier (SSID), ma sono configurati con CA diverse certificati. Ciò è utile se le reti wireless della tua organizzazione sono situati in più regioni geografiche, e ogni regione richiede dell'autorità di certificazione. Ad esempio, le firme legali possono richiedere una che richiede una CA regionale.

Nota: Android supporta setCaCertificate dall'API 18 (Jelly Bean), ma gli amministratori IT devono eseguire il provisioning delle reti separatamente con ciascuna CA per garantire che i dispositivi abbiano un'autenticazione senza interruzioni a prescindere dalla regione.

Specifica i certificati CA per identificare il server

Per specificare un elenco di certificati X.509 che identificano il server utilizzando lo stesso SSID, includi tutte le CA pertinenti nella configurazione wireless utilizzando WifiEnterpriseConfig.setCaCertificates().

Il certificato di un server è valido se la sua CA corrisponde a uno dei certificati forniti. I nomi predefiniti vengono assegnati automaticamente ai certificati e utilizzati all'interno della configurazione. La WifiManager installa il certificato e salva automaticamente la configurazione quando di rete è abilitata e rimuove il certificato quando la configurazione eliminati.

Per ottenere tutti i certificati CA associati alla configurazione wireless, utilizza WifiEnterpriseConfig.getCaCertificates() per restituire un elenco di X509Certificate oggetti.

Aggiungi una configurazione wireless utilizzando più certificati CA

  1. Verifica l'identità del server:
    1. Carica i certificati CA X.509.
    2. Carica la chiave privata e il certificato del client. Per un esempio di come leggere un file di certificato, consulta Sicurezza con HTTPS e SSL.
  2. Crea un nuovo elemento WifiConfiguration e impostarne l'SSID e la gestione delle chiavi.
  3. Imposta WifiEnterpriseConfig su questo WifiConfiguration.
    1. Identifica il server con un elenco di X509Certificate utilizzando setCaCertificates().
    2. Imposta le credenziali, l'identità e la password del client.
    3. Imposta il protocollo EAP (Extensible Authentication Protocol) e il metodo Fase 2 come parte dello sviluppo della connessione.
  4. Aggiungi la rete con WifiManager.
  5. Attiva la rete. WifiManager salva automaticamente la configurazione durante configurazione.

Questo esempio collega i passaggi:

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

Specifica una tastiera separata per il profilo di lavoro

Puoi inserire nella lista consentita un'applicazione Telefono separata da utilizzare in un profilo di lavoro. Può trattarsi della tastiera stessa o di un'app Voice over IP (VoIP) che implementa la funzione ConnectionService per il backend di chiamata. In questo modo viene fornita la stessa composizione integrata dell'interfaccia utente del sistema alle applicazioni VoIP nel profilo di lavoro, rendendo il lavoro dialer è una funzionalità principale. Le chiamate in arrivo per gli account di lavoro per le chiamate vengono differenziate dalle chiamate in arrivo agli account per le chiamate personali.

L'utente può scegliere di effettuare e ricevere chiamate dalla tastiera di lavoro inclusa nella lista consentita sull'account di un telefono. Tutte le chiamate in entrata da quella tastiera o in arrivo account telefono, vengono registrati nell'account di CallLog o il provider di servizi di terze parti. La tastiera di lavoro mantiene un registro chiamate di solo lavoro con accesso unicamente contatti di lavoro. Le chiamate dell'interruttore di circuito in arrivo vengono gestite dal compositore principale e memorizzato in un registro chiamate personale. Se un profilo di lavoro viene eliminato, il registro chiamate associati a quel profilo di lavoro verranno eliminati, così come tutti i profili di lavoro e i dati di Google Cloud.

Le app di terze parti devono implementare ConnectionService

App VoIP di terze parti che devono effettuare e ricevere chiamate integrate nell'app per smartphone integrata possono implementare ConnectionService tramite Google Cloud CLI o tramite l'API Compute Engine. È obbligatorio per qualsiasi servizio VoIP utilizzato per le chiamate di lavoro. Queste app traggono vantaggio dal fatto che le chiamate vengano trattate come le tradizionali chiamate su rete mobile, Ad esempio, vengono visualizzati nella tastiera di sistema integrata e nel registro chiamate. Se implementazione dell'app ConnectionService è installato nel profilo di lavoro, è accessibile solo da un telefono installato in quel profilo di lavoro.

Dopo che lo sviluppatore ha implementato ConnectionService, aggiungerla al file manifest dell'app e registrare una PhoneAccount con TelecomManager. L'account telefonico rappresenta un metodo distinto per effettuare o ricevere chiamate. e possono esserci più PhoneAccounts per ogni ConnectionService. Dopo la registrazione dell'account telefonico, l'utente può abilitarlo tramite le impostazioni della tastiera.

Notifiche e integrazione dell'UI di sistema

L'interfaccia utente di sistema offre agli utenti un'esperienza di chiamata coerente e integrata per le app di terze parti che utilizzano ConnectionService come backend per effettuare chiamate. Se usi l'app in un profilo di lavoro, una valigetta quando arriva un'icona di chiamata e nella barra di stato. Un'app che implementa L'app ConnectionService installata nel profilo di lavoro può usare: dialer di sistema o creare una tastiera di lavoro separata. Può trattarsi di una singola app app separate.

L'applicazione Telefono determina se sta effettuando o ricevendo una chiamata di lavoro ricerca della bandiera in corso... android.telecom.Call.Details.PROPERTY_ENTERPRISE_CALL. Se la chiamata è di lavoro, il dialer lo indica all'utente aggiungendo una chiamata badge di lavoro (icona a forma di valigetta):

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
}