Impostare le configurazioni gestite

Se stai sviluppando app per il mercato aziendale, potresti aver bisogno di in modo da soddisfare particolari requisiti stabiliti dai criteri di un'organizzazione. Configurazioni gestite, precedentemente note come restrizioni delle applicazioni, consentire all'amministratore IT dell'organizzazione di specificare da remoto le impostazioni per app. Questa funzionalità è particolarmente utile per i modelli di cui è stato eseguito il deployment in un profilo di lavoro.

Ad esempio, un'organizzazione potrebbe richiedere che le app approvate consentano Amministratore IT per:

  • Consentire o bloccare gli URL per un browser web
  • Specifica se un'app può sincronizzare i contenuti tramite cellulare o solo tramite Wi-Fi
  • Configurare le impostazioni email dell'app

Questa guida illustra come implementare le impostazioni di configurazione gestita in la tua app. Per visualizzare app di esempio con una configurazione gestita, consulta ManagedConfigurations. Se sei uno sviluppatore di gestione della mobilità aziendale (EMM), consulta la guida all'API Android Management.

Nota: per motivi storici, queste impostazioni di configurazione sono note come limitazioni e sono implementate con file e classi che utilizzano questo (ad esempio RestrictionsManager). Tuttavia, questi restrizioni possono implementare una vasta gamma di opzioni di configurazione, non solo limitazioni sulla funzionalità dell'app.

Panoramica della configurazione remota

Le app definiscono le opzioni di configurazione gestita che possono essere eseguite da remoto configurato da un amministratore IT. Si tratta di impostazioni arbitrarie che possono essere modificata da un fornitore di configurazione gestita. Se la tua app è in esecuzione in un profilo di lavoro, l'amministratore IT può cambiare la configurazione gestita dell'app.

Il fornitore di configurazioni gestite è un'altra app in esecuzione sullo stesso dispositivo. Questa app è generalmente controllata dall'amministratore IT. La L'amministratore IT comunica le modifiche alla configurazione del fornitore di servizi di configurazione. L'app, a sua volta, modifica le configurazioni.

Per fornire configurazioni gestite esternamente:

  • Dichiara le configurazioni gestite nel file manifest dell'app. Attività consente all'amministratore IT di leggere i dati dell'app tramite le API di Google Play.
  • Ogni volta che l'app riprende, usa l'oggetto RestrictionsManager per controllare lo stato attuale configurazioni gestite e modificare l'interfaccia utente e il comportamento dell'app in conformi a queste configurazioni.
  • Tieni d'occhio l'evento Intenzione ACTION_APPLICATION_RESTRICTIONS_CHANGED. Quando ricevi questo trasmetti, controlla RestrictionsManager per vedere cosa le attuali configurazioni gestite e apporta le modifiche necessarie alle tue il comportamento dell'app.

Definisci le configurazioni gestite

La tua app può supportare qualsiasi configurazione gestita che vuoi definire. Dichiari le configurazioni gestite dell'app in un file di configurazioni gestite e dichiarare il file di configurazione nel manifest. La creazione di un file di configurazione ti consente altre app per esaminare le configurazioni gestite fornite dalla tua app. Partner EMM possono leggere le configurazioni dell'app utilizzando le API di Google Play.

Per definire le opzioni di configurazione remota dell'app, inserisci il seguente elemento nel file manifest Elemento <application>:

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

Crea un file denominato app_restrictions.xml nel Directory res/xml. La struttura di tale file è descritta in il riferimento per RestrictionsManager. Il file contiene singolo elemento <restrictions> di primo livello, che contiene un elemento secondario <restriction> per ogni configurazione l'opzione di cui dispone l'app.

Nota: non creare versioni localizzate del di configurazione gestita. La tua app può avere soltanto singolo file di configurazioni gestite, quindi le configurazioni saranno e lo stesso vale per la tua app in tutte le lingue.

In un ambiente aziendale, generalmente un EMM utilizza schema di configurazione per generare una console remota per l'IT , in modo che gli amministratori possano configurare da remoto un'applicazione.

Il fornitore della configurazione gestita può eseguire una query sull'app per trovare i dettagli sulle configurazioni disponibili dell'app, inclusa la relativa descrizione testo. Il fornitore di configurazioni e l'amministratore IT possono modificare configurazioni gestite in qualsiasi momento, anche quando l'app non è in esecuzione.

Ad esempio, supponiamo che la tua app possa essere configurata da remoto per consentire o vietare l'accesso per scaricare dati tramite una rete cellulare. La tua app potrebbe avere un <restriction> elemento come questo:

<?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>

Puoi utilizzare l'attributo android:key di ogni configurazione per leggere il valore da un bundle di configurazione gestita. Per questo motivo, ogni configurazione deve avere una stringa chiave univoca e la stringa non possono essere localizzati. Deve essere specificato con un valore letterale stringa.

Nota: in un'app di produzione, android:title e android:description deve essere estratto da una risorsa localizzata come descritto in Localizzazione con le risorse.

Un'app definisce le limitazioni utilizzando i bundle all'interno di un bundle_array. Ad esempio, un'app con più opzioni di connessione VPN può definire ciascun server VPN configurazione in un bundle, con più Gruppi raggruppati in un array di bundle:

<?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>

I tipi supportati per l'elemento android:restrictionType sono elencati nella Tabella 1 e documentati in il riferimento per RestrictionsManager e RestrictionEntry.

Tabella 1. Tipi di voci di limitazione e utilizzo.

Tipo android:restrictionType Utilizzo tipico
TYPE_BOOLEAN "bool" Un valore booleano, true o false.
TYPE_STRING "string" Un valore di stringa, ad esempio un nome.
TYPE_INTEGER "integer" Un numero intero con un valore compreso tra Da MIN_VALUE a MAX_VALUE.
TYPE_CHOICE "choice" Un valore stringa selezionato da android:entryValues, presentate in genere come un elenco a selezione singola.
TYPE_MULTI_SELECT "multi-select" Un array di stringhe con valori selezionati da android:entryValues. Da utilizzare per presentare un elenco a selezione multipla in cui sono presenti più è possibile selezionare una voce, ad esempio per scegliere titoli specifici da inserire nella lista consentita.
TYPE_NULL "hidden" Tipo di restrizione nascosto. Usa questo tipo per le informazioni devono essere trasferiti ma non devono essere presentati l'utente nell'interfaccia utente. Memorizza un singolo valore di stringa.
TYPE_BUNDLE_ARRAY "bundle_array" Da usare per archiviare array di restrizioni bundles. Disponibile in Android 6.0 (livello API 23).

Nota: i android:entryValues sono leggibili automaticamente e non possono essere localizzato. Utilizza android:entries per presentare valori leggibili che possono essere localizzati. Ogni voce deve avere un indice corrispondente in android:entryValues.

Controlla le configurazioni gestite

La tua app non riceve automaticamente notifiche quando altre app modificano il relativo le impostazioni di configurazione. È invece necessario verificare quale di configurazione sono l'avvio o il riavvio dell'app e resta in ascolto di un l'intento di sistema di capire se le configurazioni cambiano mentre sia in esecuzione.

Per conoscere le impostazioni di configurazione attuali, la tua app utilizza un RestrictionsManager oggetto. La tua app dovrebbe verifica le configurazioni gestite attuali nei seguenti orari:

Per ottenere un oggetto RestrictionsManager, recupera lo stato attuale attività con getActivity(), poi chiama il metodo Activity.getSystemService() di quell'attività:

Kotlin

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

Java

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

Una volta che hai un RestrictionsManager, puoi ottenere impostazioni di configurazione correnti richiamando il suo Metodo getApplicationRestrictions():

Kotlin

var appRestrictions: Bundle = myRestrictionsMgr.applicationRestrictions

Java

Bundle appRestrictions = myRestrictionsMgr.getApplicationRestrictions();

Nota: per comodità, puoi anche recuperare i dati attuali configurazioni con un UserManager, chiamando UserManager.getApplicationRestrictions(). Questo metodo si comporta esattamente uguale a RestrictionsManager.getApplicationRestrictions().

Il metodo getApplicationRestrictions() richiede la lettura da spazio di archiviazione dati, quindi dovrebbe essere fatto con parsimonia. Non chiamare questo metodo ogni volta che devi la configurazione attuale. Devi chiamarla una volta quando l'app all'avvio o alla ripresa e nella cache del bundle di configurazioni gestite recuperato. Poi ascolta per l'intent ACTION_APPLICATION_RESTRICTIONS_CHANGED per scoprire se la configurazione modificare mentre l'app è attiva, come descritto nella Ascolta le modifiche alla configurazione gestita.

Lettura e applicazione delle configurazioni gestite

Il metodo getApplicationRestrictions() restituisce un Bundle contenente una coppia chiave-valore per ogni configurazione impostata. La sono tutti di tipo Boolean, int, String e String[]. Una volta che hai configurazioni gestite Bundle, puoi controllare lo stato attuale di configurazione con i metodi Bundle standard per questi tipi di dati, ad esempio getBoolean() o getString().

Nota: le configurazioni gestite Bundle contiene un elemento per ogni configurazione impostata esplicitamente da un del fornitore di configurazioni gestite. Tuttavia, non si può dare per scontato che una sarà presente nel bundle solo perché hai definito un valore predefinito nel file XML delle configurazioni gestite.

Spetta alla tua app intraprendere le azioni appropriate in base all'attuale impostazioni di configurazione gestita. Ad esempio, se la tua app include che specifica se può scaricare i dati su un rete mobile e scopri che la configurazione è impostata su false, dovrai disattivare il download dei dati, tranne quando il dispositivo disponga di una connessione Wi-Fi, come mostrato nel seguente codice di esempio:

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
}

Per applicare più restrizioni nidificate, leggi bundle_array voce della limitazione come raccolta di Parcelable oggetti e trasmetti come Bundle. In questo esempio, la configurazione di ogni VPN I dati vengono analizzati e utilizzati per creare un elenco di scelte per le connessioni al server:

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
}

Ascolta le modifiche alla configurazione gestita

Ogni volta che vengono modificate le configurazioni gestite di un'app, il sistema attiva Intenzione ACTION_APPLICATION_RESTRICTIONS_CHANGED. La tua app deve ascoltare questo intent per consentirti di modificare il comportamento dell'app quando le impostazioni di configurazione modifica.

Nota: l'intent ACTION_APPLICATION_RESTRICTIONS_CHANGED viene inviato solo agli ascoltatori registrati dinamicamente, non ai listener dichiarati nel file manifest dell'app.

Il seguente codice mostra come registrare dinamicamente un broadcast receiver per questo 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: in genere non è necessario ricevere notifiche per la tua app sulle modifiche alla configurazione quando questo è in pausa. Dovresti invece annullare la registrazione il broadcast receiver quando l'app è in pausa. Quando l'app riprende, per prima cosa controllare le configurazioni gestite attuali (come discusso Controlla le configurazioni gestite), quindi registrati il tuo broadcast receiver per assicurarti di ricevere una notifica relativa alle modifiche alla configurazione che si verificano mentre l'app è attiva.

Invia feedback sulla configurazione gestita ai provider EMM

Dopo aver applicato le modifiche alla configurazione gestita alla tua app, ti consigliamo di informare gli EMM lo stato della modifica. Android supporta una funzionalità chiamata stati delle app con chiave, che puoi da utilizzare per inviare un feedback ogni volta che l'app tenta di applicare modifiche alla configurazione gestita. Questo un feedback può servire a confermare che la tua app ha impostato correttamente le configurazioni gestite oppure includi un messaggio di errore se l'applicazione delle modifiche specificate non è riuscita per l'app.

I provider EMM sono in grado di recuperare questo feedback e di mostrarlo nelle proprie console per l'IT amministratori. Per ulteriori informazioni, leggi l'articolo Inviare feedback sulle app ai provider EMM informazioni sull'argomento, inclusa una guida dettagliata su come aggiungere feedback alla tua app.

Altri esempi di codice

La colonna ManagedConfigurations l'esempio illustra ulteriormente l'uso delle API trattati in questa pagina.