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
.
Цель этого приложения — предоставить некоторую конфигурацию для каждой сети, когда приложение оператора связи не установлено, и операторы связи/изготовители оборудования должны вносить в него лишь минимальные изменения в своих собственных образах. Вместо этого операторы связи должны предоставить отдельное приложение для настройки оператора, позволяющее распространять обновления через такие каналы, как магазины приложений.
Как привилегия предоставляется приложению оператора связи
Соответствующее приложение оператора связи должно быть подписано тем же сертификатом, что и на SIM-карте, как описано в разделе «Привилегии оператора UICC» .
Какая информация передается в приложение оператора связи
Приложение-оператор поставляется со следующими значениями, что позволяет ему принимать динамическое решение о том, какие значения возвращать:
- МСС
- ТНК
- СПН
- ИМСИ
- ГИД1
- ГИД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.
- Переопределите
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 и переименованные API, представленные в Android 15:
Устарело (Android 14 или более ранняя версия) | Эквивалент (Android 15 или выше) |
---|---|
TelephonyManager.isVoiceCapable() | TelephonyManager.isDeviceVoiceCapable() |
TelephonyManager.isSmsCapable() | TelephonyManager.isDeviceSmsCapable() |