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

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)

Приложение конфигурации платформы

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

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

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

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

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

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

  • МЦК
  • ТНК
  • СПН
  • ИМСИ
  • 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-интерфейсы и переименованные API-интерфейсы, представленные в Android 15:

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