携帯通信会社固有の構成

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 デバイスなど)