page.title=Carrier Configuration @jd:body
The Android 6.0 Marshmallow release introduces a capability for privileged applications to provide carrier-specific configuration to the platform. This functionality, based on the UICC carrier privilege functionality introduced in Android 5.1 (Lollipop MR1), will allow carrier configuration to be moved away from the static configuration overlays and give carriers and OEMs the ability to dynamically provide carrier configuration to the platform through a defined interface.
A properly signed carrier app can either be preloaded in the system image, installed automatically, or manually installed through an app store. The app will be queried by the platform to provide configuration for settings including:
Note: This app must be signed with the certificate that has a matching signature to one on the SIM. See the How is privilege granted to a Carrier App section for details.
The determination of what values to return is entirely up to the Carrier App and can be dynamic based on detailed information passed to the app via the platform.
The key benefits of this approach are:
The carrier configuration supplied by this feature is a set of key-value pairs that change various telephony-related behaviors in the platform.
The set of values for a particular device is determined by querying the following components in order:
Important: If a value for a particular key is returned at any stage, the first value found takes precedence over the further stages.
A generic Platform Config App is bundled with the system image that can supply
values for any variables the regular Carrier App does not. The platform config
app can be found (in M) in: packages/apps/CarrierConfig
This app’s purpose is to provide some per-network configuration when a Carrier App is not installed, and carriers/OEMs should make only minimal changes to it in their own images. Instead carriers should provide the separate Carrier App for carrier customization, allowing updates to be distributed via avenues such as app stores.
The Carrier App in question must be signed with the same certificate found on the SIM card, as documented in UICC Carrier Privileges.
The Carrier App is supplied with the following values, enabling it to make a dynamic decision as to what values to return:
The building of the list of key value pairs occurs:
See the android.service.carrier.CarrierService#onLoadConfig() reference for more details.
Note: The platform caches carrier
configuration bundles and loads from the cache for SIM state changes. This is
to speed up boot and SIM hot swap. It is assumed that without a package update
or an explicit notifyConfigChangedForSubId
, the config bundle has
not been modified.
Once the configuration has been built, the values contained within it are used to set various values of system configuration, including:
The list of keys is defined as part of the public SDK in android.telephony.CarrierConfigManager
and cannot change within the same API level. See the table below for a summary of keys.
Your application must target the Android 6.0 API level (23).
onLoadConfig
to return the values you wish to
supply based on the service.carrier.CarrierIdentifier
object
passed.
notifyConfigChangedForSubId
in scenarios
where carrier configuration may change over time (e.g. when the
user adds extra services to their account)
An example is below:
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; } }
Please see the android.service.carrier.CarrierService reference on developer.android.com for more details.
An example is below:
<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>
See UICC Carrier Privileges for the requirements.
Once you have built your configuration application, you can test your code with: