携帯通信会社固有の構成

Android 6.0 以降、携帯通信会社固有の構成をプラットフォームに提供する特権アプリ機能が導入されています。この機能は、Android 5.1(Lollipop MR1)で導入された UICC 携帯通信会社権限機能に基づいています。この機能により、携帯通信会社固有の構成が静的構成オーバーレイから切り離されるため、携帯通信会社や OEM は、定義済みインターフェースを通じて動的に携帯通信会社固有構成をプラットフォームに提供できるようになります。

適切に署名された携帯通信会社アプリは、システム イメージにプリロードすることも、自動的にインストールすることも、アプリストアから手動でインストールすることもできます。携帯通信会社アプリは、プラットフォームからクエリされると、以下のような構成情報を提供します。

  • ネットワークのローミング / 非ローミング
  • ビジュアル ボイスメール
  • SMS / MMS ネットワーク設定
  • VoLTE / IMS 構成

返される値の決定は、携帯通信会社アプリが行います。携帯通信会社アプリは、プラットフォーム経由で渡される詳細情報に基づいて、動的に決定を行うことができます。

このアプローチには、以下のようなメリットがあります。

  • 動的構成 - MCCMNC に依拠しない構成(たとえば、モバイル仮想ネットワーク事業者(MVNO)や、顧客による追加サービスのオプトイン)のようなコンセプトをサポートできます。
  • 各種チャネルから購入したデバイスのサポート - たとえば、オープン マーケット スマートフォンであっても、アプリストアからアプリをダウンロードすることで、自動的に適切な構成に設定することができます。
  • セキュリティ - 構成を提供する権限は、携帯通信会社が署名したアプリに対してのみ付与されます。
  • 定義済み API - 以前は、携帯通信会社固有の構成はほとんどの場合、公開 API 経由ではなく、フレームワーク内の内部 XML オーバーレイの中に保存されていました。Android 6.0 以降は、Carrier Config API が公開され、明確に定義されています。

仕組み

構成の読み込み

この機能によって提供される携帯通信会社の構成は、プラットフォーム内のさまざまな電話関連の動作を変更する Key-Value ペアのセットです。

以下のコンポーネントを順にクエリすることで、対象デバイス用の値のセットが決定されます。

  1. 携帯通信会社アプリ(必須ではありませんが、Android オープンソース プロジェクト(AOSP)内に存在する構成以外の追加構成を指定する場合におすすめします)
  2. システム イメージにバンドルされているプラットフォーム構成アプリ
  3. フレームワークにハードコーディングされているデフォルト値(Android 6.0 より前のリリースの動作と同等です)

プラットフォーム構成アプリ

システム イメージには、汎用のプラットフォーム構成アプリがバンドルされています。このアプリは、通常の携帯通信会社アプリが指定しない変数の値を指定することができます。プラットフォーム構成アプリは packages/apps/CarrierConfig にあります(Android 6.0 の場合)。

このアプリの目的は、携帯通信会社アプリがインストールされていない場合に対象ネットワークに応じた構成を提供することです。携帯通信会社 / OEM は、それぞれの独自イメージ内でプラットフォーム構成アプリに変更を加える場合、変更を最小限に抑える必要があります。代わりに、携帯通信会社は、携帯通信会社固有カスタマイズ用の携帯通信会社アプリを別個に提供し、アプリストアなどのチャネルを通じてアップデートを配信する必要があります。

携帯通信会社アプリに権限を付与する方法

UICC 携帯通信会社権限に記載されているように、携帯通信会社アプリには、SIM カード上の証明書と同じ証明書を使用して署名する必要があります。

携帯通信会社アプリに渡される情報

携帯通信会社アプリに対して、以下の値が渡されます。これに応じて、携帯通信会社アプリは、返す値を動的に決定することができます。

  • MCC
  • MNC
  • SPN
  • IMSI
  • GID1
  • GID2
  • 携帯通信会社 ID

携帯通信会社 ID の統合について詳しくは、携帯通信会社 ID と CarrierConfig の統合をご覧ください。

携帯通信会社設定の読み込みが発生するタイミング

Key-Value ペアのリストが生成されるタイミングは次のとおりです。

  • SIM がロードされたとき(ブート、または SIM ホットスワップ)
  • 携帯通信会社アプリが手動でリロードをトリガーしたとき
  • 携帯通信会社アプリがアップデートされたとき

詳細については、android.service.carrier.CarrierService#onLoadConfig() のリファレンスをご覧ください。

構成を使用する

構成が作成されると、その構成に含まれる値を使用して、システム構成に関するさまざまな値が設定されます。たとえば、以下のような設定が該当します。

  • 内部フレームワーク テレフォニー設定
  • SDK が返す構成値(たとえば、SmsManager 内の値)
  • 電話アプリの VVM 接続値などのアプリ設定

構成キー

キーのリストは、公開 SDK の一部として android.telephony.CarrierConfigManager 内に定義されており、同じ API レベル内で変更することはできません。キーの概要については、下記の表をご覧ください。

アプリをビルドする

アプリを作成する

アプリは Android 6.0 API レベル(23)をターゲットにする必要があります。

android.service.carrier.CarrierService をオーバーライドするクラスを宣言する

  1. 渡された service.carrier.CarrierIdentifier オブジェクトに基づいて指定値を返すように onLoadConfig をオーバーライドします。
  2. 携帯通信会社固有構成が時間の経過とともに変化する可能性のあるシナリオの場合、notifyConfigChangedForSubId を呼び出すロジックを追加します(たとえば、ユーザーがアカウントに追加サービスを追加する場合など)。

たとえば、次のようになります。

    public class SampleCarrierConfigService extends CarrierService {

        private static final String TAG = "SampleCarrierConfigService";

        public SampleCarrierConfigService() {
            Log.d(TAG, "Service created");
        }

        @Override
        public PersistableBundle onLoadConfig(CarrierIdentifier id) {
            Log.d(TAG, "Config being fetched");
            PersistableBundle config = new PersistableBundle();
            config.putBoolean(
                CarrierConfigManager.KEY_CARRIER_VOLTE_AVAILABLE_BOOL, true);
            config.putBoolean(
                CarrierConfigManager.KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL, false);
            config.putInt(CarrierConfigManager.KEY_VOLTE_REPLACEMENT_RAT_INT, 6);
            // Check CarrierIdentifier and add more config if needed…
            return config;
        }
    }
    

詳細については、android.service.carrier.CarrierService リファレンスをご覧ください。

マニフェスト内でクラスに名前を付ける

たとえば、次のようになります。

    <service android:name=".SampleCarrierConfigService"
    android:label="@string/service_name"
    android:permission="android.permission.BIND_CARRIER_SERVICES">
          <intent-filter>
          <action android:name="android.service.carrier.ConfigService"/></intent-filter>
    </service>
    

SIM 上の証明書と同じ証明書を使用してアプリに署名する

要件については、UICC 携帯通信会社権限をご覧ください。

アプリをテストする

構成アプリをビルドしたら、以下を使用してコードをテストします。

  • 有効な証明書署名を含む SIM
  • Android 6.0 以降を搭載しているデバイス(Android デバイスなど)