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.
Per vedere com'è impostato il criterio, utilizza
DevicePolicyManager.getCrossProfileContactsSearchDisabled()
.Per attivare o disattivare la ricerca nei contatti di lavoro in base al profilo personale, utilizza
DevicePolicyManager.setCrossProfileContactsSearchDisabled()
.
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.
- Installa un'app VPN che implementa
VpnService
. Puoi trovare i servizi VPN attivi utilizzando un filtro per intent che corrisponde alla azioneVpnService.SERVICE_INTERFACE
. - Dichiara un
VpnService
nel manifest dell'app protetto dall'autorizzazioneBIND_VPN_SERVICE
. - 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. - 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 suoisetApplicationRestrictions()
. - 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 utilizzandosetAlwaysOnVpnPackage()
, 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
- Verifica l'identità del server:
- Carica i certificati CA X.509.
- 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.
- Crea un nuovo elemento
WifiConfiguration
e impostarne l'SSID e la gestione delle chiavi. - Imposta
WifiEnterpriseConfig
su questoWifiConfiguration
.- Identifica il server con un elenco di
X509Certificate
utilizzandosetCaCertificates()
. - Imposta le credenziali, l'identità e la password del client.
- Imposta il protocollo EAP (Extensible Authentication Protocol) e il metodo Fase 2 come parte dello sviluppo della connessione.
- Identifica il server con un elenco di
- Aggiungi la rete con
WifiManager
. - 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 }