В Android 6.0 и более поздних версий есть возможность для приложений с особыми правами предоставлять платформе конфигурацию, относящуюся к определенному оператору связи. Эта функция, основанная на привилегиях оператора UICC, которые появились в Android 5.1 (Lollipop MR1), позволяет перенести конфигурацию оператора из статических наложений конфигурации и дает операторам и производителям оригинального оборудования возможность динамически предоставлять конфигурацию оператора платформе через определенный интерфейс.
Приложение оператора связи с действительной подписью может быть предварительно загружено в образ системы, установлено автоматически или вручную через магазин приложений. Платформа запрашивает у приложения конфигурацию для следующих настроек:
- Сети в роуминге и не в роуминге
- Визуальная голосовая почта
- Настройки сети для 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
Это приложение предназначено для настройки сети, когда приложение оператора связи не установлено. Операторы связи и производители устройств должны вносить в него минимальные изменения в своих образах. Вместо этого операторы должны предоставлять отдельное приложение, в котором можно настраивать устройство. Обновления для него можно распространять через магазины приложений.
Как предоставляются права приложению оператора
Приложение оператора должно быть подписано тем же сертификатом, который находится на SIM-карте, как описано в разделе Привилегии оператора на UICC.
Какая информация передается в приложение оператора связи
Приложению оператора связи передаются следующие значения, на основе которых оно может динамически определять, какие значения возвращать:
- MCC
- MNC
- SPN
- [номер] IMSI
- GID1
- GID2
- Идентификатор оператора
Подробнее о том, как интегрировать идентификаторы операторов с CarrierConfig…
Когда загружается конфигурация оператора
Список пар "ключ-значение" создается:
- При загрузке SIM-карты (загрузка или горячая замена SIM-карты).
- Когда приложение оператора вручную запускает перезагрузку.
- Когда обновляется приложение оператора связи
Подробную информацию вы найдете в
android.service.carrier.CarrierService#onLoadConfig().
Как использовать конфигурацию
Когда конфигурация создана, содержащиеся в ней значения используются для задания различных значений системной конфигурации, в том числе:
- Внутренние настройки телефонии
- Значения конфигурации, возвращаемые SDK, например в SmsManager
- Настройки приложения, например значения подключения VVM в приложении "Телефония".
Ключи конфигурации
Список ключей определяется как часть общедоступного SDK в android.telephony.CarrierConfigManager и не может быть изменен в рамках одного уровня API. Сводная информация о ключах приведена в таблице ниже.
Создайте приложение
Как создать приложение
Приложение должно быть предназначено для API уровня 23 (Android 6.0).
Объявите класс, который переопределяет 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 Carrier Privileges.
Как добавить точки доступа с помощью приложения оператора
Чтобы добавить APN программно из приложения оператора (например, во время активации SIM-карты), используйте API
ContentResolver. Они позволяют добавлять элементы APN поставщику контента, который идентифицируется по URI
android.provider.Telephony.Carriers.CONTENT_URI.
Дополнительную информацию о структуре таблицы для URI контента можно найти в
Telephony.Carriers.
Подробнее о точках доступа и конфигурации оператора…
Протестируйте приложение
После того как вы создадите приложение для настройки, вы сможете протестировать код с помощью:
- SIM-карта с действительной подписью сертификата.
- устройство с Android 6.0 или более поздней версии, например устройство Android;
Как задать возможности оператора
В Android возможности оператора связи описывают, поддерживаются ли на устройстве голосовые услуги, обмен сообщениями и передача данных. Операторы могут задавать возможности сервисов на уровне устройства и подписки (Android 15 или более поздней версии).
Возможности сервисов на уровне устройства
Возможности сервисов на уровне устройства настраиваются при его производстве и не могут быть изменены после этого. Операторы могут указывать возможности на уровне устройства, переопределяя следующие системные ресурсы:
Приложения могут запрашивать возможности сервисов на уровне устройства с помощью следующих API:
Возможности сервисов на уровне подписки
На устройствах с Android 15 и более поздними версиями операторы могут указывать возможности сервиса на уровне подписки. Чтобы указать возможности сервиса на уровне подписки, используйте
CarrierConfigManager.KEY_CELLULAR_SERVICE_CAPABILITIES_INT_ARRAY API. Например, чтобы указать, что подписка включает только передачу данных, задайте значение
SubscriptionManager#SERVICE_CAPABILITY_DATA.
Приложения (предустановленные системные и сторонние приложения) могут запрашивать возможности сервиса оператора для определенной подписки с помощью метода
SubscriptionInfo.getServiceCapabilities(). Это позволяет разработчикам приложений настраивать пользовательский интерфейс приложений на основе доступных возможностей подписки. Например, разработчики приложений могут запретить совершать звонки через приложение для набора номера, если у пользователя оформлена подписка только на передачу данных.
Устаревшие API для функций сервисов
В Android 15 появились сервисы, доступные как на уровне устройства, так и на уровне подписки. В связи с этим изменением существующие API возможностей на уровне устройства были переименованы для удобства чтения. В таблице ниже перечислены API, поддержка которых прекращена, и API, переименованные в Android 15.
| Устаревший (Android 14 или более ранние версии) | Эквивалент (Android 15 или более поздняя версия) |
|---|---|
TelephonyManager.isVoiceCapable() |
TelephonyManager.isDeviceVoiceCapable() |
TelephonyManager.isSmsCapable() |
TelephonyManager.isDeviceSmsCapable() |