Redes y telefonía

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.

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.

  1. Instala una app de VPN que implemente VpnService Puedes encontrar servicios de VPN activos usando un filtro de intents que coincida con la acción VpnService.SERVICE_INTERFACE
  2. Declara un VpnService en el manifiesto de la app, con la protección del permiso BIND_VPN_SERVICE
  3. 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.
  4. 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 su setApplicationRestrictions() .
  • 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 con setAlwaysOnVpnPackage(), 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

  1. Verifica la identidad del servidor:
    1. Carga los certificados de la AC de X.509.
    2. 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.
  2. Crear un nuevo WifiConfiguration y configura su SSID y administración de claves.
  3. Configura WifiEnterpriseConfig en este WifiConfiguration.
    1. Identifica el servidor con una lista de X509Certificate que usan setCaCertificates()
    2. Configura las credenciales, la identidad y la contraseña del cliente.
    3. 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.
  4. Agrega la red con el WifiManager
  5. 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
}