В Android 6.0 и более поздних версиях привилегированные приложения могут предоставлять платформе конфигурацию, специфичную для оператора. Эта функция, основанная на привилегиях оператора UICC, представленных в Android 5.1 (Lollipop MR1), позволяет вывести конфигурацию оператора из статических оверлеев конфигурации и предоставляет операторам связи и OEM-производителям возможность динамически предоставлять платформе конфигурацию оператора через определённый интерфейс.
Правильно подписанное приложение оператора связи может быть предустановлено в образе системы, установлено автоматически или вручную через магазин приложений. Платформа запрашивает у приложения конфигурацию, включающую следующие параметры:
- Роуминговые/нероуминговые сети
- Визуальная голосовая почта
- Настройки сети SMS/MMS
- Конфигурации VoLTE/IMS
Определение того, какие значения возвращать, полностью зависит от приложения-оператора и может быть динамическим на основе подробной информации, передаваемой в приложение через платформу.
Основные преимущества такого подхода:
- Динамическая конфигурация — поддержка таких концепций, как конфигурация, не производная от MCCMNC, например, операторы мобильных виртуальных сетей (MVNO) или клиенты, выбравшие дополнительные услуги.
- Поддержка устройств, продаваемых через любой канал . Например, телефон с открытым рынком можно автоматически настроить, загрузив приложение из магазина приложений.
- Безопасность . Право на предоставление этой конфигурации предоставлено только приложениям, подписанным оператором.
- Определенный API — ранее эта конфигурация хранилась преимущественно во внутренних XML-файлах фреймворка, а не через общедоступный API. API конфигурации оператора в Android 6.0 является общедоступным и четко определенным.
Как это работает
Загрузить конфигурацию
Конфигурация оператора, предоставляемая этой функцией, представляет собой набор пар «ключ-значение», которые изменяют различные функции, связанные с телефонией, на платформе.
Набор значений для конкретного устройства определяется путем запроса следующих компонентов по порядку:
- Приложение оператора связи (это необязательно, но это рекомендуемое место для дополнительных настроек, выходящих за рамки Android Open Source Project (AOSP))
- Приложение конфигурации платформы, входящее в комплект образа системы
- Значения по умолчанию, жестко запрограммированные в фреймворке (эквивалентно поведению до Android 6.0)
Приложение конфигурации платформы
В образ системы встроено универсальное приложение конфигурации платформы. Оно может предоставлять значения для любых переменных, которые недоступны в стандартном приложении оператора. Приложение конфигурации платформы находится (в Android 6.0) в папке: packages/apps/CarrierConfig
Это приложение предназначено для настройки конфигурации сети, когда приложение оператора не установлено, и операторам связи/OEM-производителям следует вносить лишь минимальные изменения в свои образы. Вместо этого операторам связи следует предоставлять отдельное приложение для настройки, позволяя распространять обновления через магазины приложений.
Как приложению-оператору предоставляются привилегии
Рассматриваемое приложение оператора должно быть подписано тем же сертификатом, который находится на SIM-карте, как указано в документе UICC Carrier Privileges .
Какая информация передается в приложение оператора
Приложение оператора связи получает следующие значения, что позволяет ему принимать динамичные решения о том, какие значения возвращать:
- МЦК
- ТНК
- СПН
- ИМСИ
- 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
- Переопределите
onLoadConfig
, чтобы возвращать значения, которые вы хотите предоставить, на основе переданного объектаservice.carrier.CarrierIdentifier
. - Добавьте логику для вызова
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, представленные в Android 15:
Устаревшее (Android 14 или ниже) | Эквивалент (Android 15 или выше) |
---|---|
TelephonyManager.isVoiceCapable() | TelephonyManager.isDeviceVoiceCapable() |
TelephonyManager.isSmsCapable() | TelephonyManager.isDeviceSmsCapable() |