Конфигурация несущей

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

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

  • Роуминговые/нероуминговые сети
  • Визуальная голосовая почта
  • Настройки сети 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

Это приложение предназначено для настройки конфигурации сети, когда приложение оператора не установлено, и операторам связи/OEM-производителям следует вносить лишь минимальные изменения в свои образы. Вместо этого операторам связи следует предоставлять отдельное приложение для настройки, позволяя распространять обновления через магазины приложений.

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

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

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

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

  • МЦК
  • ТНК
  • СПН
  • ИМСИ
  • GID1
  • GID2
  • Идентификатор оператора

Дополнительную информацию об интеграции идентификаторов операторов см. в разделе Интеграция идентификаторов операторов с CarrierConfig .

При загрузке конфигурации носителя происходит

Формирование списка пар ключ-значение происходит:

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

Более подробную информацию см. в справочнике android.service.carrier.CarrierService#onLoadConfig() .

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

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

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

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

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

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

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

Ваше приложение должно быть ориентировано на уровень API Android 6.0 (23).

Объявите класс, который переопределяет 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» .

Добавьте APN с помощью приложения оператора

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

Для получения дополнительной информации см. APN и CarrierConfig .

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

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

  • SIM-карта, содержащая действительную подпись сертификата
  • Устройство под управлением Android 6.0 и более поздних версий, например, устройство Android

Установить возможности услуг оператора

В Android возможности услуг оператора определяют, поддерживаются ли на устройстве услуги голосовой связи, обмена сообщениями и передачи данных. Операторы могут указать возможности услуг оператора для устройства как на уровне устройства, так и на уровне подписки (Android 15 и выше).

Возможности обслуживания на уровне устройства

Возможности сервисов на уровне устройства настраиваются при его производстве (не могут быть изменены после производства). Операторы связи могут задавать возможности на уровне устройства с помощью следующих переопределений системных ресурсов:

Приложения могут запрашивать возможности сервисов на уровне устройства через следующие API:

Возможности обслуживания на уровне подписки

Для устройств под управлением Android 15 и выше операторы связи могут указать возможности сервисов на уровне подписки. Чтобы указать возможности сервисов на уровне подписки, используйте API CarrierConfigManager.KEY_CELLULAR_SERVICE_CAPABILITIES_INT_ARRAY . Например, чтобы указать, что подписка предназначена только для передачи данных, установите значение SubscriptionManager#SERVICE_CAPABILITY_DATA .

Приложения (предустановленные системные и сторонние) могут запрашивать возможности услуг оператора связи для указанной подписки через метод SubscriptionInfo.getServiceCapabilities() . Это позволяет разработчикам приложений настраивать пользовательский интерфейс приложений в зависимости от доступных возможностей подписки. Например, разработчики приложений могут запретить приложениям для набора номера совершать звонки, если у пользователя подписка только на передачу данных.

Устаревшие API-интерфейсы возможностей сервисов

Начиная с Android 15, Android предоставляет возможности обслуживания как на уровне устройства, так и на уровне подписки. В связи с этим изменением существующие API-интерфейсы, работающие на уровне устройства, были переименованы для удобства чтения. В следующей таблице перечислены устаревшие и переименованные API, представленные в Android 15:

Устаревшее (Android 14 или ниже) Эквивалент (Android 15 или выше)
TelephonyManager.isVoiceCapable() TelephonyManager.isDeviceVoiceCapable()
TelephonyManager.isSmsCapable() TelephonyManager.isDeviceSmsCapable()