Google стремится продвигать расовую справедливость для черных сообществ. Смотри как.
Эта страница была переведа с помощью Cloud Translation API.
Switch to English

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

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

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

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

  • MCC
  • MNC
  • SPN
  • IMSI
  • 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.ConfigService"/></intent-filter>
</service>

Подписание приложения с тем же сертификатом на SIM-карте

См. UICC Carrier Привилегии для требований.

Тестирование приложения

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

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