Настройка оператора

В Android 6.0 и более поздних версий есть возможность для приложений с особыми правами предоставлять платформе конфигурацию, относящуюся к определенному оператору связи. Эта функция, основанная на привилегиях оператора UICC, которые появились в Android 5.1 (Lollipop MR1), позволяет перенести конфигурацию оператора из статических наложений конфигурации и дает операторам и производителям оригинального оборудования возможность динамически предоставлять конфигурацию оператора платформе через определенный интерфейс.

Приложение оператора связи с действительной подписью может быть предварительно загружено в образ системы, установлено автоматически или вручную через магазин приложений. Платформа запрашивает у приложения конфигурацию для следующих настроек:

  • Сети в роуминге и не в роуминге
  • Визуальная голосовая почта
  • Настройки сети для SMS/MMS
  • Конфигурации VoLTE/IMS

Какие значения возвращать, полностью определяет приложение оператора. Оно может динамически выбирать их на основе подробной информации, переданной ему платформой.

Основные преимущества этого подхода:

  • Динамическая конфигурация – поддержка таких концепций, как конфигурация, не основанная на коде страны и сети мобильной связи (MCCMNC), например операторов мобильной виртуальной сети (MVNO) или согласия клиента на дополнительные услуги.
  • Поддержка устройств, проданных через любой канал. Например, телефон, купленный на открытом рынке, можно автоматически настроить, скачав приложение из магазина приложений.
  • Безопасность. Привилегия на предоставление этой конфигурации предоставляется только приложениям, подписанным оператором связи.
  • Определенный API. Ранее эта конфигурация хранилась в основном во внутренних оверлеях XML в рамках фреймворка, а не в общедоступном API. API конфигурации оператора в Android 6.0 является общедоступным и хорошо определенным.

Принцип работы

Загрузите конфигурацию

Конфигурация оператора, предоставляемая этой функцией, представляет собой набор пар "ключ-значение", которые изменяют различные аспекты работы телефонии на платформе.

Набор значений для определенного устройства определяется путем запроса следующих компонентов в указанном порядке:

  1. Приложение оператора связи (необязательно, но рекомендуется для дополнительной настройки, не предусмотренной в Android Open Source Project (AOSP)).
  2. Приложение для настройки платформы, входящее в образ системы.
  3. Значения по умолчанию, жестко заданные в платформе (как в версиях до Android 6.0).

Приложение для настройки платформы

В образ системы входит общее приложение для настройки платформы. Это приложение может предоставлять значения для любых переменных, которые не может предоставить обычное приложение оператора. Приложение для настройки платформы можно найти в Android 6.0 по следующему пути: packages/apps/CarrierConfig

Это приложение предназначено для настройки сети, когда приложение оператора связи не установлено. Операторы связи и производители устройств должны вносить в него минимальные изменения в своих образах. Вместо этого операторы должны предоставлять отдельное приложение, в котором можно настраивать устройство. Обновления для него можно распространять через магазины приложений.

Как предоставляются права приложению оператора

Приложение оператора должно быть подписано тем же сертификатом, который находится на SIM-карте, как описано в разделе Привилегии оператора на UICC.

Какая информация передается в приложение оператора связи

Приложению оператора связи передаются следующие значения, на основе которых оно может динамически определять, какие значения возвращать:

  • MCC
  • MNC
  • SPN
  • [номер] IMSI
  • GID1
  • GID2
  • Идентификатор оператора

Подробнее о том, как интегрировать идентификаторы операторов с CarrierConfig…

Когда загружается конфигурация оператора

Список пар "ключ-значение" создается:

  • При загрузке SIM-карты (загрузка или горячая замена SIM-карты).
  • Когда приложение оператора вручную запускает перезагрузку.
  • Когда обновляется приложение оператора связи

Подробную информацию вы найдете в android.service.carrier.CarrierService#onLoadConfig().

Как использовать конфигурацию

Когда конфигурация создана, содержащиеся в ней значения используются для задания различных значений системной конфигурации, в том числе:

  • Внутренние настройки телефонии
  • Значения конфигурации, возвращаемые SDK, например в SmsManager
  • Настройки приложения, например значения подключения VVM в приложении "Телефония".

Ключи конфигурации

Список ключей определяется как часть общедоступного SDK в android.telephony.CarrierConfigManager и не может быть изменен в рамках одного уровня API. Сводная информация о ключах приведена в таблице ниже.

Создайте приложение

Как создать приложение

Приложение должно быть предназначено для API уровня 23 (Android 6.0).

Объявите класс, который переопределяет android.service.carrier.CarrierService.

  1. Переопределите onLoadConfig, чтобы возвращать нужные значения на основе переданного объекта service.carrier.CarrierIdentifier.
  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 Carrier Privileges.

Как добавить точки доступа с помощью приложения оператора

Чтобы добавить APN программно из приложения оператора (например, во время активации SIM-карты), используйте API ContentResolver. Они позволяют добавлять элементы APN поставщику контента, который идентифицируется по URI android.provider.Telephony.Carriers.CONTENT_URI. Дополнительную информацию о структуре таблицы для URI контента можно найти в Telephony.Carriers.

Подробнее о точках доступа и конфигурации оператора…

Протестируйте приложение

После того как вы создадите приложение для настройки, вы сможете протестировать код с помощью:

  • 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 появились сервисы, доступные как на уровне устройства, так и на уровне подписки. В связи с этим изменением существующие API возможностей на уровне устройства были переименованы для удобства чтения. В таблице ниже перечислены API, поддержка которых прекращена, и API, переименованные в Android 15.

Устаревший (Android 14 или более ранние версии) Эквивалент (Android 15 или более поздняя версия)
TelephonyManager.isVoiceCapable() TelephonyManager.isDeviceVoiceCapable()
TelephonyManager.isSmsCapable() TelephonyManager.isDeviceSmsCapable()