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

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 .

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

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

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

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

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

  • Центр клиентов
  • ТНК
  • SPN
  • ИМСИ
  • GID1
  • ГИД2
  • Идентификатор оператора связи

Дополнительные сведения об интеграции идентификаторов операторов см. в разделе Интеграция идентификаторов операторов с 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.