携帯通信会社の設定

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.CarrierService"/></intent-filter>
</service>

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

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

携帯通信会社アプリで APN を追加する

携帯通信会社アプリから APN をプログラムで追加する(SIM の有効化時など)には、ContentResolverAPI を使用して、URI android.provider.Telephony.Carriers.CONTENT_URI で識別されるコンテンツ プロバイダに APN アイテムを追加します。コンテンツ URI のテーブル構造の詳細については、 Telephony.Carriers をご覧ください。

詳しくは、APN と CarrierConfig をご覧ください。

アプリをテストする

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

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

携帯通信会社サービス機能を設定する

Android では、携帯通信会社サービス機能によって、音声、メッセージ、データのサービスがデバイスでサポートされているかどうかが示されます。携帯通信会社は、デバイスの携帯通信会社サービス機能をデバイスごとや定期購入ごと(Android 15 以降)に指定できます。

デバイスごとのサービス機能

デバイスごとのサービス機能は、デバイスの製造時に構成されます(製造後は変更できません)。携帯通信会社は、次のシステム リソースのオーバーライドを通じてデバイスごとの機能を指定できます。

アプリは、次の API を通じてデバイスごとのサービス機能を照会できます。

定期購入ごとのサービス機能

Android 15 以降を搭載したデバイスでは、携帯通信会社定期購入ごとにデバイスのサービス機能を指定できます。定期購入ごとのサービス機能を指定するには、 CarrierConfigManager.KEY_CELLULAR_SERVICE_CAPABILITIES_INT_ARRAY API を使用します。たとえば、定期購入がデータのみであることを指定するには、値を SubscriptionManager#SERVICE_CAPABILITY_DATA に設定します。

アプリ(プリロードされたシステムアプリとサードパーティ製アプリ)は、 SubscriptionInfo.getServiceCapabilities() メソッドを通じて、指定された定期購入の携帯通信会社サービス機能を照会できます。これによりアプリ デベロッパーは、定期購入で利用可能な機能に基づいてアプリのユーザー エクスペリエンスをカスタマイズできます。たとえば、アプリ デベロッパーは、ユーザーがデータのみの定期購入を利用している場合、電話アプリで通話できないようにすることができます。

サポートが終了したサービス機能の API

Android 15 以降、Android はデバイスごとと定期購入ごとの両方のサービス機能を提供しています。この変更により、既存のデバイスごとの機能 API の名前が変更され、読みやすくなりました。次の表に、Android 15 で導入された非推奨 API と名前が変更された API を示します。

非推奨(Android 14 以前) 同等(Android 15 以降)
TelephonyManager.isVoiceCapable() TelephonyManager.isDeviceVoiceCapable()
TelephonyManager.isSmsCapable() TelephonyManager.isDeviceSmsCapable()