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

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 .

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

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

  • MCC
  • MNC
  • SPN
  • IMSI
  • GID1
  • GID2
  • ID оператора связи

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

При загрузке конфига несущей происходит

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

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

Дополнительные сведения см. В android.service.carrier.CarrierService#onLoadConfig() по 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-устройство.