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 AnunciarRestrictionsManager
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
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:
- Cuando se inicia o se reanuda la app, en su
Método
onResume()
- Cuando se notifica a la app de un cambio de configuración, como se describe en Escucha la configuración administrada Cambios
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.