管理対象設定のセットアップ

エンタープライズ市場向けのアプリを開発する場合は、 組織のポリシーによって設定された特定の要件を満たすことができます。 管理対象設定(旧称「アプリケーションの制限」)は、 組織の IT 管理者がリモートで 。この機能は特に、組織が承認した 仕事用プロファイルにデプロイされます

たとえば、組織によっては、承認されたアプリが IT 管理者が行う操作:

  • ウェブブラウザで URL を許可またはブロックする
  • アプリにモバイル経由のコンテンツ同期を許可するか、同期のみを許可するかを設定します Wi-Fi 経由
  • アプリのメール設定を構成する

このガイドでは、Google Chat で管理対象設定を実装する方法について説明します: 説明します。管理対象構成を使用したサンプルアプリを表示するには、ManagedConfigurations をご覧ください。 企業向けモバイル管理(EMM)のデベロッパーの方は、Android Management API ガイドをご覧ください。

注: 歴史的な理由から、これらの設定は 制限があり、これを使用するファイルとクラスで実装されます。 (RestrictionsManager など)。ただし、 制限により、実際にはさまざまな構成オプションを実装できます。 アプリの機能制限だけでなく

リモート構成の概要

リモート接続が可能な管理対象設定オプションをアプリで定義 ファイアウォールルールがありますこれらは任意の設定で 管理対象設定プロバイダが 変更した場合ですアプリが仕事用プロファイルで実行されている場合 IT 管理者はアプリの管理対象設定を変更できます。

管理対象設定プロバイダは、同じデバイスで実行されている別のアプリです。 通常、このアプリは IT 管理者によって管理されています。「 IT 管理者が、構成の変更を管理対象 設定プロバイダ アプリ。そのアプリによってアプリの構成が変更されます。

外部で管理される構成を提供するには:

  • アプリ マニフェストで管理対象設定を宣言します。行うこと IT 管理者はアプリケーションの Google Play API での設定を行えます
  • アプリが再開するたびに、RestrictionsManager オブジェクトを使用して現在の 構成を管理し、アプリの UI と動作を それらの構成に準拠する必要があります。
  • アテンション機構の ACTION_APPLICATION_RESTRICTIONS_CHANGED インテント。通知を受信した場合 RestrictionsManager をチェックして、 現在の管理対象構成を確認し、必要に応じて構成を 制御できます。

管理対象構成を定義する

アプリは、定義する必要のあるあらゆる管理対象設定をサポートできます。宣言する アプリの管理対象設定を管理対象構成ファイルで指定し、 マニフェスト内の構成ファイルを使用します。構成ファイルを作成すると、 アプリが提供する管理対象設定を調べる。EMM パートナー Google Play API を使用してアプリの設定を読み取ることができる。

アプリのリモート構成オプションを定義するには、次の要素を配置します。 マニフェストの <ph type="x-smartling-placeholder"></ph> <application> 要素:

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

app_restrictions.xml という名前のファイルをアプリの res/xml ディレクトリ。このファイルの構造については、 RestrictionsManager のリファレンス。ファイルには 単一のトップレベルの <restrictions> 要素。これには以下が含まれます。 構成ごとに 1 つの <restriction> 子要素 選択します。

注: 使用されます。お客様のアプリは、 単一の管理対象構成ファイルであるため、 すべての言語 / 地域でアプリの一貫性を保つ必要があります。

エンタープライズ環境では、EMM では通常、 構成スキーマを作成して、IT 部門向けのリモート コンソール できます。管理者は、管理者がリモートで 説明します。

管理対象設定プロバイダはアプリにクエリを実行して詳細を確認できる アプリの使用可能な構成に関する情報(説明など) あります。構成プロバイダと IT 管理者は、 いつでも管理対象設定を管理できます。

たとえば、アプリが許可または禁止するようにリモートで設定されるとします。 モバイル接続でデータをダウンロードするようにできます。たとえば、 次のような <restriction> 要素があります。

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

各構成の android:key 属性を使用して、 管理対象設定バンドルからその値を読み取ります。このため、 各設定には一意のキー文字列が必要で、その文字列と ローカライズできません。文字列リテラルで指定する必要があります。

注: 製品版アプリでは、android:titleandroid:description はローカライズされたリソースから取得する必要があります 詳しくは、 リソースによるローカライズ

アプリは bundle_array 内のバンドルを使用して制限を定義します。 たとえば、アプリに複数の VPN 接続オプションがある場合は、それぞれの VPN サーバーを定義できます。 1 つの 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>

android:restrictionType 要素でサポートされる型 表 1 に記載されています。そのドキュメントについては、 RestrictionsManager のリファレンスと、 RestrictionEntry

表 1. 制限エントリのタイプと使用法。

タイプ android:restrictionType 一般的な使用方法
TYPE_BOOLEAN "bool" ブール値(true または false)。
TYPE_STRING "string" 名前などの文字列値。
TYPE_INTEGER "integer" 次の値を持つ整数: MIN_VALUEMAX_VALUE
TYPE_CHOICE "choice" android:entryValues から選択された文字列値。 通常は単一選択リストとして表示されます
TYPE_MULTI_SELECT "multi-select" android:entryValues から選択された値を含む文字列配列。 複数選択のリストを表示する際に、複数の エントリを選択できます。たとえば、許可リストに登録する特定のタイトルを選択するなどです。
TYPE_NULL "hidden" 非表示の制限のタイプ。このタイプは、変更される前の データの移行が必要だが、プレゼンテーションの 表示することもできます。単一の文字列値を格納します。
TYPE_BUNDLE_ARRAY "bundle_array" 制限の配列を格納するために使用します。 bundles。Android 6.0(API レベル 23)で使用できます。

注: android:entryValues は機械判読可能なため、 あります。android:entries を使用して、ローカライズ可能な人が読める値を提示します。 各エントリには、android:entryValues に対応するインデックスが必要です。

管理対象設定を確認する

他のアプリがアプリを変更しても、自動的には通知されません できます。その代わりに、マネージド サービス プロバイダが アプリケーションの起動時や再開時、イベントをリッスンするタイミング、 構成が変更されたかどうかをシステム インテントに 表示されます。

現在の構成設定を確認するため、アプリは RestrictionsManager オブジェクト。アプリは 以下のタイミングで、現在の管理対象構成を確認します。

RestrictionsManager オブジェクトを取得するには、現在の getActivity() でアクティビティを実行した後、 そのアクティビティの Activity.getSystemService() メソッドを呼び出します。

Kotlin

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

Java

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

RestrictionsManager を取得すると、 現在の構成設定を呼び出して、 getApplicationRestrictions() メソッド:

Kotlin

var appRestrictions: Bundle = myRestrictionsMgr.applicationRestrictions

Java

Bundle appRestrictions = myRestrictionsMgr.getApplicationRestrictions();

注: 便宜上、 次のように、UserManager を使用して構成します。 UserManager.getApplicationRestrictions()。このメソッドは、 RestrictionsManager.getApplicationRestrictions() と同じです。

getApplicationRestrictions() メソッドはデータ ストレージから読み取る必要があるため、 慎重に行う必要があります。必要なタイミングでこのメソッドを 現在の構成を把握できます呼び出しを行うのではなく、アプリが実行時に 取得した管理対象設定バンドルの開始または再開、キャッシュへの保存を行います。聴きたい ACTION_APPLICATION_RESTRICTIONS_CHANGED インテントを検索して、設定内容に問題がないか確認しましょう。 変更することもできます。詳しくは、 管理対象構成の変更をリッスンする

管理対象設定の読み取りと適用

getApplicationRestrictions() メソッドは Bundle を返します。 に Key-Value ペアを格納します。「 値はすべて BooleanintStringString[]。手順が 管理対象設定Bundle。現在のリソース デフォルトの Bundle メソッドを使用すると、 データ型(getBoolean() など) または getString()

注: 管理対象設定 Bundle プロバイダによって明示的に設定された構成ごとに 1 つの項目が 使用されます。ただし、 デフォルトの構成がバンドルに含まれるため、 値を宣言する必要があります。

現在のポリシーに基づいて適切に対処するかどうかは、 設定を管理することもおすすめしますたとえば、アプリに インターネット経由でデータをダウンロードできるかどうかを指定する モバイル接続では設定が [設定] で false 様、次の場合を除き、データのダウンロードを無効にする必要があります デバイスが Wi-Fi に接続されている(次のサンプルコードを参照)。

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
}

複数のネストされた制限を適用するには、次をご覧ください。 bundle_array Parcelable オブジェクトのコレクションとしての制限エントリ Bundle としてキャストします。この例では、各 VPN の構成に データが解析され、それを使用してサーバー接続の選択肢のリストが作成されます。

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
}

管理対象設定の変更をリッスンする

アプリの管理対象設定が変更されるたびに、 ACTION_APPLICATION_RESTRICTIONS_CHANGED インテント。アプリは 構成設定が変更されたときにアプリの動作を変更できるように、このインテントを あります。

注: ACTION_APPLICATION_RESTRICTIONS_CHANGED インテントはリスナーにのみ送信されます。 宣言されたリスナーではなく、動的に登録される 使用します。

次のコードは、ブロードキャスト レシーバを動的に登録する方法を示しています。 確認します。

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);

注: 通常、アプリに通知する必要はありません。 一時停止時に構成の変更に関する情報が出力されることはありません。代わりに、クラスメートの ブロードキャスト レシーバが受信するように設定されます。アプリを再開すると、 まず、現在の管理対象設定を確認します( 管理対象設定を確認)から登録する ブロードキャスト レシーバの設定を変更して、構成の変更に関する通知を受け取れるようにします。 アプリがアクティブな間に発生することはありません。

管理対象設定のフィードバックを EMM に送信する

管理対象の設定変更をアプリに適用したら、EMM に次の情報を通知することをおすすめします。 変更のステータスを確認できます。Android はキー付きアプリの状態と呼ばれる機能をサポートしています。 アプリが管理対象設定の変更を適用しようとするたびに、フィードバックの送信に使用されます。この フィードバックは、アプリによる管理対象設定が正常に行われたことを確認するか、 アプリが指定の変更を適用できなかった場合にエラー メッセージを表示する。

EMM プロバイダはこのフィードバックを取得して、IT 向けにコンソールに表示できます。 できます。詳しくは、EMM にアプリのフィードバックを送信するをご覧ください。 (アプリにフィードバック サポートを追加する方法の詳細なガイドなど)が含まれます。

その他のコードサンプル

ManagedConfigurations には、 サンプルは、このページで取り上げた API の使用方法をさらに示しています。