Cómo establecer configuraciones administradas

Si estás desarrollando apps para el mercado empresarial, es posible que debas para satisfacer requisitos particulares que establecen las políticas de una organización. Las configuraciones administradas, antes conocidas como restricciones de aplicaciones permitir que el administrador de TI de la organización especifique la configuración de forma remota para de Google Chat. Esta capacidad es particularmente útil para proyectos las apps implementadas en un perfil de trabajo.

Por ejemplo, una organización puede exigir que las apps aprobadas permitan Administrador de TI:

  • Cómo permitir o bloquear URLs en un navegador web
  • Configura si una app puede sincronizar contenido con datos móviles o solo por Wi-Fi
  • Establece la configuración del correo electrónico de la app

En esta guía, se muestra cómo implementar parámetros de configuración administrados en tu app. Para ver las apps de ejemplo con una configuración administrada, consulta ManagedConfigurations. Si eres desarrollador de administración de movilidad empresarial (EMM), consulta la Guía de la API de Android Management.

Nota: Por razones históricas, estos parámetros de configuración se conocen como restricciones y se implementan con archivos y clases que usan esto término (como RestrictionsManager). Sin embargo, estos pueden implementar una amplia gama de opciones de configuración, y no solo restricciones en cuanto a las funciones de una app.

Descripción general de la configuración remota

Las apps definen las opciones de configuración administradas que se pueden que estableció un administrador de TI. Estos son parámetros de configuración arbitrarios que se pueden por un proveedor de configuración administrado. Si tu app se ejecuta en un perfil de trabajo, el administrador de TI puede cambiar la configuración administrada de tu app.

El proveedor de configuraciones administradas es otra app que se ejecuta en el mismo dispositivo. Por lo general, el administrador de TI controla esta app. El El administrador de TI comunica los cambios de configuración al administrador la app del proveedor de configuración. Esa app, a su vez, cambia la configuración de la tuya.

Para proporcionar configuraciones administradas de forma externa, haz lo siguiente:

  • Declara las configuraciones administradas en el manifiesto de tu app. Hacer por lo que permite que el administrador de TI lea de tu app a través de las APIs de Google Play.
  • Cada vez que se reanude la app, usa el objeto RestrictionsManager para comprobar el valor configuraciones administradas y cambias la IU y el comportamiento de tu app a cumplir con esas configuraciones.
  • Escucha el ACTION_APPLICATION_RESTRICTIONS_CHANGED. Cuándo lo recibas Anunciar RestrictionsManager para ver son las configuraciones administradas actuales y realiza los cambios necesarios en tu el comportamiento de la app.

Define la configuración administrada

Tu app puede admitir cualquier configuración administrada que desees definir. Declaras el de configuración administradas de la app en un archivo de configuraciones administradas y declara el archivo de configuración en el manifiesto. La creación de un archivo de configuración te permite otras apps para examinar las configuraciones administradas que proporciona tu app. Socios de EMM pueden leer las configuraciones de tu app con las APIs de Google Play.

Para definir las opciones de configuración remota de tu app, coloca el siguiente elemento en la carpeta de archivos del manifiesto Elemento <application>:

<meta-data android:name="android.content.APP_RESTRICTIONS"
    android:resource="@xml/app_restrictions" />

Crea un archivo llamado app_restrictions.xml en la carpeta res/xml. La estructura de ese archivo se describe en la referencia de RestrictionsManager. El archivo tiene un único elemento <restrictions> de nivel superior, que contiene un elemento secundario <restriction> para cada configuración opción que tiene la app.

Nota: No crees versiones localizadas de los de configuración administrado. Tu app solo puede tener una único archivo de configuración administrada, por lo que las configuraciones sea uniforme para tu app en todos los parámetros de configuración regionales.

En un entorno empresarial, por lo general, un EMM usará de configuración para generar una consola remota para los equipos de TI para que los administradores puedan configurar de forma remota tu y mantener la integridad de su aplicación.

El proveedor de configuración administrada puede consultar la app para obtener detalles. en las configuraciones disponibles de la app, incluida su descripción texto. El proveedor de configuración y el administrador de TI pueden cambiar el configuraciones administradas en cualquier momento, incluso cuando la app no se está ejecutando.

Por ejemplo, supongamos que tu app se puede configurar de forma remota para permitir o prohibir para descargar datos a través de una conexión móvil. Tu app podría tener una <restriction> como el siguiente:

<?xml version="1.0" encoding="utf-8"?>
<restrictions xmlns:android="http://schemas.android.com/apk/res/android">

  <restriction
    android:key="downloadOnCellular"
    android:title="@string/download_on_cell_title"
    android:restrictionType="bool"
    android:description="@string/download_on_cell_description"
    android:defaultValue="true" />

</restrictions>

Usa el atributo android:key de cada configuración para lo siguiente: lee su valor de un paquete de configuración administrado. Por este motivo, cada configuración debe tener una cadena de clave única, y la cadena no se puede localizar. Debe especificarse con un literal de string.

Nota: En una app de producción, android:title y android:description debe extraerse de un recurso localizado de Terraform, como se describe en Cómo localizar con recursos.

Una app define restricciones con paquetes dentro de una bundle_array. Por ejemplo, una app con varias opciones de conexión de VPN podría definir cada servidor de VPN configuración en un bundle, con varios Conjuntos agrupados en un array de paquete:

<?xml version="1.0" encoding="utf-8"?>
<restrictions xmlns:android="http://schemas.android.com/apk/res/android" >

  <restriction
    android:key="vpn_configuration_list"
    android:restrictionType="bundle_array">
    <restriction
      android:key="vpn_configuration"
      android:restrictionType="bundle">
      <restriction
        android:key="vpn_server"
        android:restrictionType="string"/>
      <restriction
        android:key="vpn_username"
        android:restrictionType="string"/>
      <restriction
        android:key="vpn_password"
        android:restrictionType="string"/>
    </restriction>
  </restriction>

</restrictions>

Los tipos admitidos para el elemento android:restrictionType se enumeran en la Tabla 1 y se documentan en la referencia para RestrictionsManager y RestrictionEntry

Tabla 1: Tipos de entradas de restricción y uso.

Tipo android:restrictionType Uso común
TYPE_BOOLEAN "bool" Es un valor booleano, verdadero o falso.
TYPE_STRING "string" Un valor de cadena, como un nombre.
TYPE_INTEGER "integer" Un número entero con un valor de MIN_VALUE a MAX_VALUE
TYPE_CHOICE "choice" Un valor de cadena seleccionado de android:entryValues normalmente se presenta como una lista de selección única.
TYPE_MULTI_SELECT "multi-select" Un array de cadenas con valores seleccionados de android:entryValues. Utilízalo para presentar una lista de selección múltiple en la que haya más de una para seleccionar una entrada específica, por ejemplo, para elegir títulos específicos en la lista de entidades permitidas.
TYPE_NULL "hidden" Tipo de restricción oculto. Usa este tipo para la información que deben transferirse, pero no deben presentarse el usuario en la IU. Almacena un solo valor de cadena.
TYPE_BUNDLE_ARRAY "bundle_array" Usa esto para almacenar arrays de restricciones. bundles Disponible en Android 6.0 (nivel de API 23).

Nota: android:entryValues son legibles por máquina y no se pueden localizada. Usa android:entries para presentar valores legibles que puedan localizarse. Cada entrada debe tener un índice correspondiente en android:entryValues.

Verifica las configuraciones administradas

Tu app no recibe notificaciones automáticas cuando otras apps cambian su parámetros de configuración. En cambio, debes verificar cuáles son configuraciones son el momento en que se inicia o se reanuda tu app, y buscan una intent del sistema para averiguar si las configuraciones cambian mientras tu se está ejecutando la app.

Para descubrir los ajustes de configuración actuales, tu app usa un RestrictionsManager. Tu app debe verificar las configuraciones administradas actuales en los siguientes momentos:

Para obtener un objeto RestrictionsManager, obtén el valor actividad con getActivity() y, luego, Llama al método Activity.getSystemService() de esa actividad:

Kotlin

var myRestrictionsMgr =
        activity?.getSystemService(Context.RESTRICTIONS_SERVICE) as RestrictionsManager

Java

RestrictionsManager myRestrictionsMgr =
    (RestrictionsManager) getActivity()
        .getSystemService(Context.RESTRICTIONS_SERVICE);

Una vez que tengas un elemento RestrictionsManager, podrás obtener la parámetros de configuración actuales llamando al Método getApplicationRestrictions():

Kotlin

var appRestrictions: Bundle = myRestrictionsMgr.applicationRestrictions

Java

Bundle appRestrictions = myRestrictionsMgr.getApplicationRestrictions();

Nota: Para tu comodidad, también puedes recuperar el estado parámetros de configuración con un UserManager, llamando UserManager.getApplicationRestrictions() Este método se comporta exactamente como igual que RestrictionsManager.getApplicationRestrictions().

El método getApplicationRestrictions() requiere leer desde el almacenamiento de datos, por lo que debe hacerse con moderación. No llames a este método cada vez que necesites hacerlo. conocer la configuración actual. En cambio, debes llamarlo una vez cuando tu app inicio o reanudación, y almacenar en caché el paquete de configuraciones administradas que se recuperaron. Luego, escucha para que el intent ACTION_APPLICATION_RESTRICTIONS_CHANGED averigüe si la configuración cambios mientras tu app está activa, como se describe en Escucha los cambios de la configuración administrada.

Lee y aplica configuraciones administradas

El método getApplicationRestrictions() devuelve un Bundle. que contenga un par clave-valor para cada configuración establecida. El los valores son todos de tipo Boolean, int, String y String[]. Una vez que tengas configuraciones administradas Bundle, puedes comprobar parámetros de configuración con los métodos Bundle estándar para esos tipos de datos, como getBoolean() o getString()

Nota: Las configuraciones administradas Bundle contiene un elemento para cada configuración establecida explícitamente por una de configuraciones administradas. Sin embargo, no puedes suponer que un configuración estará presente en el paquete solo porque hayas definido una en el archivo en formato XML de configuraciones administradas.

Depende de tu app tomar las medidas adecuadas según la situación parámetros de configuración administrados. Por ejemplo, si tu app tiene una configuración que especifique si puede descargar datos a través de un móvil, y notas que la configuración está establecida en false, deberás inhabilitar la descarga de datos, excepto cuando El dispositivo debe tener una conexión Wi-Fi, como se muestra en el siguiente código de ejemplo:

Kotlin

val appCanUseCellular: Boolean =
        if (appRestrictions.containsKey("downloadOnCellular")) {
            appRestrictions.getBoolean("downloadOnCellular")
        } else {
            // cellularDefault is a boolean using the restriction's default value
            cellularDefault
        }

if (!appCanUseCellular) {
    // ...turn off app's cellular-download functionality
    // ...show appropriate notices to user
}

Java

boolean appCanUseCellular;

if (appRestrictions.containsKey("downloadOnCellular")) {
    appCanUseCellular = appRestrictions.getBoolean("downloadOnCellular");
} else {
    // cellularDefault is a boolean using the restriction's default value
    appCanUseCellular = cellularDefault;
}

if (!appCanUseCellular) {
    // ...turn off app's cellular-download functionality
    // ...show appropriate notices to user
}

Para aplicar varias restricciones anidadas, consulta bundle_array entrada de restricción como una colección de objetos Parcelable y transmitir como Bundle. En este ejemplo, la configuración de cada VPN los datos se analizan y se usan para crear una lista de opciones de conexión del servidor:

Kotlin

// VpnConfig is a sample class used store config data, not defined
val vpnConfigs = mutableListOf<VpnConfig>()

val parcelables: Array<out Parcelable>? =
        appRestrictions.getParcelableArray("vpn_configuration_list")

if (parcelables?.isNotEmpty() == true) {
    // iterate parcelables and cast as bundle
    parcelables.map { it as Bundle }.forEach { vpnConfigBundle ->
        // parse bundle data and store in VpnConfig array
        vpnConfigs.add(VpnConfig()
                .setServer(vpnConfigBundle.getString("vpn_server"))
                .setUsername(vpnConfigBundle.getString("vpn_username"))
                .setPassword(vpnConfigBundle.getString("vpn_password")))
    }
}

if (vpnConfigs.isNotEmpty()) {
    // ...choose a VPN configuration or prompt user to select from list
}

Java

// VpnConfig is a sample class used store config data, not defined
List<VpnConfig> vpnConfigs = new ArrayList<>();

Parcelable[] parcelables =
    appRestrictions.getParcelableArray("vpn_configuration_list");

if (parcelables != null && parcelables.length > 0) {
    // iterate parcelables and cast as bundle
    for (int i = 0; i < parcelables.length; i++) {
        Bundle vpnConfigBundle = (Bundle) parcelables[i];
        // parse bundle data and store in VpnConfig array
        vpnConfigs.add(new VpnConfig()
            .setServer(vpnConfigBundle.getString("vpn_server"))
            .setUsername(vpnConfigBundle.getString("vpn_username"))
            .setPassword(vpnConfigBundle.getString("vpn_password")));
    }
}

if (!vpnConfigs.isEmpty()) {
    // ...choose a VPN configuration or prompt user to select from list
}

Detecta cambios de configuración administrados

Cuando se cambian las configuraciones administradas de una app, el sistema activa ACTION_APPLICATION_RESTRICTIONS_CHANGED. Tu app debe detectar este intent para que puedas cambiar el comportamiento de la app cuando los ajustes de cambio.

Nota: El intent ACTION_APPLICATION_RESTRICTIONS_CHANGED solo se envía a los objetos de escucha registrados de forma dinámica, no a objetos de escucha declarados en el manifiesto de la app.

El siguiente código muestra cómo registrar dinámicamente un receptor de emisión para este intent:

Kotlin

val restrictionsFilter = IntentFilter(Intent.ACTION_APPLICATION_RESTRICTIONS_CHANGED)

val restrictionsReceiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {

        // Get the current configuration bundle
        val appRestrictions = myRestrictionsMgr.applicationRestrictions

        // Check current configuration settings, change your app's UI and
        // functionality as necessary.
    }
}

registerReceiver(restrictionsReceiver, restrictionsFilter)

Java

IntentFilter restrictionsFilter =
    new IntentFilter(Intent.ACTION_APPLICATION_RESTRICTIONS_CHANGED);

BroadcastReceiver restrictionsReceiver = new BroadcastReceiver() {
  @Override public void onReceive(Context context, Intent intent) {

    // Get the current configuration bundle
    Bundle appRestrictions = myRestrictionsMgr.getApplicationRestrictions();

    // Check current configuration settings, change your app's UI and
    // functionality as necessary.
  }
};

registerReceiver(restrictionsReceiver, restrictionsFilter);

Nota: Por lo general, no es necesario que se notifique a la app. sobre los cambios de configuración cuando está en pausa. En su lugar, debes cancelar el registro al receptor de emisión cuando la app esté pausada. Cuando se reanude la app, primero comprueba las configuraciones administradas actuales (como se explica en Revisa las configuraciones administradas) y, luego, regístrate tu receptor de transmisiones para asegurarte de recibir notificaciones sobre los cambios de configuración que ocurren mientras la app está activa.

Envía comentarios sobre la configuración administrada a EMM

Después de aplicar los cambios de configuración administrada en tu app, se recomienda notificar a las EMM sobre el estado del cambio. Android admite una función llamada estados de apps con clave, que puedes usar para enviar comentarios cada vez que tu app intente aplicar cambios de configuración administrada. Esta Los comentarios pueden confirmar que tu app establece configuraciones administradas correctamente Incluir un mensaje de error si tu app no puede aplicar los cambios especificados.

Los proveedores de EMM pueden recuperar estos comentarios y mostrarlos en sus consolas para TI. que los administradores vean. Consulta Cómo enviar comentarios sobre la app a EMM para obtener más información información sobre el tema, incluida una guía detallada sobre cómo agregar a tu aplicación asistencia relacionada con los comentarios.

Muestras de código adicionales

Los ManagedConfigurations este ejemplo demuestra aún más el uso de las APIs que se abordan en esta página.