En las funciones de esta guía, se describe la administración de redes y telefonía. que puedes implementar en tu política de dispositivo controladora (DPC). Este documento contiene código de muestra y también puedes usar el botón Test app de DPC como una fuente de código de muestra para las funciones empresariales de Android.
Una app de DPC se puede ejecutar en el modo de propietario del perfil en dispositivos personales o en el propietario del dispositivo en dispositivos completamente administrados. En esta tabla, se indican los atributos disponible cuando el DPC se ejecuta en el modo de propietario de perfil o propietario de dispositivo automático:
Función | Propietario del perfil | Propietario del dispositivo |
Accede a los contactos de trabajo en todos los perfiles | ✓ | |
Garantiza un conexión de red segura para el tráfico laboral | ✓ | ✓ |
Configura un ID de una sola red inalámbrica en todas las regiones | ✓ | ✓ |
Especifique un marcador independiente para el perfil de trabajo | ✓ |
Accede a los contactos de trabajo en diferentes perfiles
Los EMM pueden permitir que el perfil personal de un usuario acceda a sus contactos laborales para que se puede acceder a los contactos personales y laborales de un usuario a través de la búsqueda local y la búsqueda de directorios remotos. En los dispositivos personales, hay un solo marcador en la red perfil puede realizar y recibir llamadas personales, así como llamadas de trabajo. Además, los contactos de trabajo están bien integrados en la IU del sistema. Si el perfil de trabajo está encriptados, sus datos no están disponibles para el perfil personal.
Integrado en la IU del sistema
La IU del sistema indica las llamadas de trabajo entrantes mediante un ícono de maletín. El
callLog
también muestra la
para designar llamadas de trabajo entrantes y salientes. El teléfono personal y
Las apps de contactos pueden mostrar la información del identificador de llamadas de un contacto laboral con un control remoto.
directorio, por lo que no es necesario que el contacto ya esté sincronizado en el
dispositivo local. La app de mensajería puede realizar búsquedas y usar el identificador de llamadas locales.
La Definición de compatibilidad de Android El documento (CDD) incluye requisitos. para que los contactos de trabajo aparezcan en el marcador predeterminado y los requisitos Las apps de contactos y mensajería tienen una insignia que indica que provienen de tu trabajo. perfil.
Se puede acceder a los contactos de trabajo y se pueden buscar
El usuario puede acceder a los contactos de trabajo y llamarlos desde su perfil personal, que en la pantalla de búsqueda de la app de Teléfono. El usuario puede buscar trabajo. contactos (a través de la función de autocompletar) que se sincronizan localmente con el dispositivo y se enumeran a través de una búsqueda de directorio remota.
Controlar los contactos de trabajo en el perfil principal
El DPC controla el permiso para buscar contactos de trabajo. Se publica en el propietario del perfil , el DPC administra la visibilidad de los contactos de trabajo en el perfil personal. Para obtener más información, consulta Crea una política de dispositivo. controlador.
La búsqueda de contactos de trabajo por el perfil personal está habilitada de forma predeterminada.
Para ver cómo se establece la política, usa
DevicePolicyManager.getCrossProfileContactsSearchDisabled()
Para habilitar o inhabilitar la búsqueda de contactos de trabajo por medio del perfil personal, usa
DevicePolicyManager.setCrossProfileContactsSearchDisabled()
Garantiza una conexión de red segura para el tráfico laboral
Ejecutar en un modo de propietario de dispositivo o de propietario del perfil, una política de dispositivo puede usar una conexión de red privada virtual (VPN) siempre encendida para forzar a las aplicaciones a pasar el tráfico a través de una app de VPN específica que no se puede se evita. Con una conexión VPN siempre activa, el DPC puede garantizar que la red el tráfico de un perfil de trabajo o un dispositivo administrado pasa por un servicio de VPN sin intervención del usuario. Este proceso crea una conexión de red segura para tráfico continuo en un perfil de trabajo.
Información acerca de las conexiones VPN siempre activadas
Como parte del framework del sistema, el enrutamiento VPN se administra automáticamente
el usuario no puede omitir el servicio de VPN. Si el servicio de VPN se desconecta mientras está
modo de bloqueo, el tráfico no puede filtrarse a la Internet abierta. Para aplicaciones
implementando
VpnService
,
la VPN siempre activada proporciona un framework para administrar una conexión VPN segura mediante
crear un servidor de confianza y mantenerlo así. El servicio de VPN reinicia automáticamente la
entre las actualizaciones de las apps, independientemente de si la conexión es por Wi-Fi o
móvil. Además, si el dispositivo se reinicia, el framework reinicia la conexión VPN.
La conexión al servicio de VPN es transparente para el usuario. Para un dispositivo de la empresa, el usuario no tiene que confirmar un cuadro de diálogo de consentimiento para un VPN en modo siempre activo La configuración de red VPN del usuario permite habilitar una la conexión siempre activa de forma manual.
Si DISALLOW_CONFIG_VPN
es true
, el usuario no puede configurar la VPN. Habilitar
DISALLOW_DEBUGGING_FEATURES
para impedir que los usuarios anulen la VPN siempre activada con el comando de depuración adb.
Para evitar que un usuario desinstale la VPN, llama
DevicePolicyManager.setUninstallBlocked
Configura el servicio de VPN
La organización que usa tu solución empresarial para Android configura la VPN.
- Instala una app de VPN que implemente
VpnService
Puedes encontrar servicios de VPN activos usando un filtro de intents que coincida con la acciónVpnService.SERVICE_INTERFACE
- Declara un
VpnService
en el manifiesto de la app, con la protección del permisoBIND_VPN_SERVICE
- Configura el
VpnService
por lo que el sistema la inicia. Evita configurar la app de VPN para que se inicie sola para detectar el inicio de un sistema y controlar su propio ciclo de vida. - Configura el entorno administrado de configuración para la app de VPN (consulta el ejemplo a continuación).
Habilita la conexión VPN siempre activa
El DPC puede configurar una conexión VPN siempre activa a través de una app específica
llamando
DevicePolicyManager.setAlwaysOnVpnPackage()
Esta conexión se otorga automáticamente y persiste después de un reinicio. Si
lockdownEnabled
es falso. Es posible que el tráfico de red no esté protegido desde el momento en que
el teléfono y la VPN se conecta. Esto es útil si no deseas
conectividad de red cada vez que la VPN falla o si la VPN no es esencial.
Verifica la conexión de VPN siempre activada
El DPC puede leer el nombre del paquete que administra una VPN siempre activa
del usuario actual con
DevicePolicyManager.getAlwaysOnVpnPackage().
Si no existe ese paquete o si la VPN se creó en la configuración del sistema
app, se muestra null
.
Ejemplo
En la app TestDPC, AlwaysOnVpnFragment.java
usa estas APIs para habilitar la configuración de una conexión de VPN siempre activa.
En el siguiente ejemplo:
- La página
de configuración de la
de servicio de VPN son configuradas por la
DevicePolicyManager
con susetApplicationRestrictions()
. - Las configuraciones administradas usan pares clave-valor arbitrarios y esta app de ejemplo los usa en otros lugares para configurar los ajustes de red de la VPN (consulta Verifica las configuraciones administradas).
- En el ejemplo, se agrega el instalador del paquete de Android a una lista de bloqueo para evitar que actualizar paquetes del sistema a través de la VPN. Todo el tráfico de red del usuario dentro el perfil de trabajo o dispositivo pasa por esta app de VPN, excepto por el paquete instalador; sus actualizaciones usan la Internet abierta.
- Luego,
DevicePolicyManager
habilita la conexión VPN siempre activa para la paquete de VPN consetAlwaysOnVpnPackage()
, y habilitando el modo de bloqueo.
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(...); }
Cómo configurar un único ID de red inalámbrica entre regiones
Ejecutar en un modo de propietario de dispositivo o de propietario del perfil, una política de dispositivo El controlador (DPC) puede asociar varios certificados de autoridad certificadora (AC) con una sola configuración de red inalámbrica. Con esta configuración, se crea automáticamente se pueden conectar a puntos de acceso inalámbricos que tienen el mismo nombre de red. identificador de conjunto de servicios (SSID), pero que están configurados con otra AC certificados. Esto es útil si las redes inalámbricas de tu organización están ubicados en varias regiones geográficas, y cada región requiere un diseño de la autoridad certificadora. Por ejemplo, para las firmas legales, se puede exigir una autorización local autoridad de seguridad que necesita una AC regional.
Nota: Android es compatible
setCaCertificate
desde la API 18 (Jelly Bean), pero los administradores de TI deben aprovisionar sus redes
por separado con cada AC para garantizar que los dispositivos tengan autenticación sin problemas en cada
de acceso local, independientemente de su región.
Especifica certificados de la AC para identificar el servidor.
Para especificar una lista de certificados X.509 que identifican al servidor con la misma
SSID, incluye todas las AC relevantes en la configuración inalámbrica mediante WifiEnterpriseConfig.setCaCertificates()
.
El certificado de un servidor es válido si su AC coincide con uno de los certificados proporcionados.
Los nombres predeterminados se asignan automáticamente a los certificados y se utilizan en el
configuración. El
WifiManager
instala el certificado y guarda automáticamente la configuración cuando
de red esté habilitada y quitará el certificado cuando se configure
borrar.
Para obtener todos los certificados de AC asociados con la configuración inalámbrica, usa
WifiEnterpriseConfig.getCaCertificates()
para mostrar una lista de
X509Certificate
.
Agrega una configuración inalámbrica a través de varios certificados de la AC
- Verifica la identidad del servidor:
- Carga los certificados de la AC de X.509.
- Carga la clave privada y el certificado del cliente. Consulta Seguridad con HTTPS y SSL para ver un ejemplo de cómo leer un archivo de certificado.
- Crear un nuevo
WifiConfiguration
y configura su SSID y administración de claves. - Configura
WifiEnterpriseConfig
en esteWifiConfiguration
.- Identifica el servidor con una lista de
X509Certificate
que usansetCaCertificates()
- Configura las credenciales, la identidad y la contraseña del cliente.
- Establece el protocolo de autenticación extensible (EAP) y el método de fase 2 como es parte esencial del establecimiento de la conexión.
- Identifica el servidor con una lista de
- Agrega la red con el
WifiManager
- Habilita la red. WifiManager guarda automáticamente la configuración durante configuración.
Este ejemplo une los pasos:
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); }
Especificar un marcador diferente para el perfil de trabajo
Puedes incluir en la lista de entidades permitidas una aplicación de Teléfono independiente para usar en un perfil de trabajo.
Puede ser el propio marcador o una app de voz sobre IP (VoIP) que implemente la
ConnectionService
API para el backend que realiza la llamada. Esto brinda la misma marcación integrada en la IU del sistema.
experiencia a las aplicaciones de VoIP en el perfil de trabajo, lo que hace que el trabajo
el marcador como una función principal. Las llamadas entrantes a las cuentas de llamadas de trabajo se
diferenciarse de las llamadas entrantes
a las cuentas de llamadas personales.
El usuario puede optar por realizar y recibir llamadas desde el marcador de trabajo incluido en la lista de entidades permitidas.
en una cuenta de teléfono. Todas las llamadas realizadas desde ese marcador o entrantes al trabajo
telefónica, se registran en el perfil de trabajo
CallLog
proveedor. El teléfono de trabajo lleva únicamente un registro de llamadas de trabajo con acceso únicamente a
contactos de trabajo. El marcador principal se encarga de las llamadas entrantes de cambio de circuito
y se almacena en un registro de llamadas personal. Si se borra un perfil de trabajo, el registro de llamadas
asociados a ese perfil de trabajo, al igual que con todos
de datos no estructurados.
Las apps de terceros deben implementar ConnectionService
Apps de VoIP de terceros que necesitan hacer llamadas telefónicas
integrado en la aplicación de teléfono integrada puede implementar la
ConnectionService
en la API de Cloud. Esto es obligatorio para cualquier servicio de VoIP que se use para llamadas de trabajo. Estas apps
se beneficien al tratar sus llamadas como las llamadas móviles tradicionales, por
por ejemplo, aparecen en el marcador integrado del sistema y en el registro de llamadas. Si el botón
para implementar apps
ConnectionService
esté instalada en el perfil de trabajo, solo se podrá acceder a ella mediante un marcador
instalada en ese perfil de trabajo.
Una vez que el desarrollador implemente
ConnectionService
,
debe agregarla al archivo de manifiesto de la aplicación y registrar un
PhoneAccount
con el
TelecomManager
Una cuenta telefónica representa un método distinto para realizar o recibir llamadas telefónicas
y puede haber múltiples PhoneAccounts
para cada
ConnectionService
Después de registrar la cuenta telefónica, el usuario
puedes habilitarlo a través de la configuración del marcador.
Integración y notificaciones de la IU del sistema
La IU del sistema proporciona a los usuarios una experiencia de marcación integrada y coherente.
para las apps de terceros que usan la
ConnectionService
como backend para realizar llamadas. Si usas la app en un perfil de trabajo, un maletín
en las llamadas entrantes y en la barra de estado. Una app que implementa
ConnectionService
instalado en el perfil de trabajo puede usar el
del sistema o crea un marcador del trabajo independiente. Pueden ser una sola app o
apps separadas.
La aplicación de marcador determina si realiza o recibe una llamada de trabajo mediante
verificando la bandera
android.telecom.Call.Details.PROPERTY_ENTERPRISE_CALL
Si se trata de una llamada de trabajo, el marcador se lo indica al usuario agregando un
insignia de trabajo (ícono de maletín):
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 }