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

В 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 Carrier Privileges .

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

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

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

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

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

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

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

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

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

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

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

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

Список ключей определяется как часть общедоступного 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 и переименованные API, представленные в Android 15:

Устарело (Android 14 или ниже) Аналогичный (Android 15 или выше)
TelephonyManager.isVoiceCapable() TelephonyManager.isDeviceVoiceCapable()
TelephonyManager.isSmsCapable() TelephonyManager.isDeviceSmsCapable()