没有数据余额的 Android 设备允许网络流量通过,这要求运营商和电信公司实施缓解协议。Android 实施了一种通用解决方案,允许运营商和电信公司指示设备何时余额不足。
Android 平台提供了一个默认运营商应用,其中包含基于强制门户检测信号的流量缓解默认行为。它还为运营商和 OEM 提供了以低成本和高灵活性自定义行为的机会。
示例和源代码
默认运营商应用位于platform/frameworks/base/packages/CarrierDefaultApp/。
实现
默认运营商应用配置为为开箱即用的未配置运营商提供更好的体验。运营商可以使用此默认行为。他们还可以通过将信号操作映射添加到运营商配置 XML 文件来覆盖默认行为。他们可以决定不使用默认应用,而是将 UICC 权限与他们自己的独立运营商应用一起使用。
实现简介
信号
Android 框架支持为以下参数化信号配置操作
TelephonyIntents.ACTION_CARRIER_SIGNAL_REDIRECTED
TelephonyIntents.ACTION_CARRIER_SIGNAL_REQUEST_NETWORK_FAILED
这些信号位于 frameworks/base/telephony/java/com/android/internal/telephony/TelephonyIntents.java
。
支持的操作
默认运营商应用定义了一组可以映射到受支持信号的受支持操作。这些在 CarrierActionUtils.java
中定义
public static final int CARRIER_ACTION_ENABLE_METERED_APNS = 0; public static final int CARRIER_ACTION_DISABLE_METERED_APNS = 1; public static final int CARRIER_ACTION_DISABLE_RADIO = 2; public static final int CARRIER_ACTION_ENABLE_RADIO = 3; public static final int CARRIER_ACTION_SHOW_PORTAL_NOTIFICATION = 4; public static final int CARRIER_ACTION_SHOW_NO_DATA_SERVICE_NOTIFICATION = 5; public static final int CARRIER_ACTION_CANCEL_ALL_NOTIFICATIONS = 6;
注意:如果运营商实施了自己的独立应用,那么他们可以实施对本节中未提及的其他信号的支持。他们也可以定义和配置自己的操作。
默认信号操作映射
按照以下流程配置默认操作
- 为受支持的信号定义一个键。
默认信号到操作的映射在
CarrierConfigManager.java
中定义。每个受支持的信号都有一个键public static final String KEY_CARRIER_DEFAULT_ACTIONS_ON_REDIRECTION_STRING_ARRAY = "carrier_default_actions_on_redirection_string_array"; public static final String KEY_CARRIER_DEFAULT_ACTIONS_ON_DCFAILURE_STRING_ARRAY = "carrier_default_actions_on_dcfailure_string_array";
- 将默认操作与信号键关联。
默认操作 ID 与信号键关联
sDefaults.putStringArray(KEY_CARRIER_DEFAULT_ACTIONS_ON_REDIRECTION_STRING_ARRAY, new String[]{ "1, 4" //1: CARRIER_ACTION_SHOW_PORTAL_NOTIFICATION // 4: CARRIER_ACTION_DISABLE_METERED_APNS });
电话框架将这些操作映射到相应的信号。
覆盖默认操作
您可以在运营商配置 XML 文件中为受支持的信号定义自定义操作,方法是将操作 ID 与信号键(在 CarrierConfigManager.java
中定义)关联。例如,以下映射禁用按流量计费的 APN,并在重定向时显示门户通知
<string-array name="carrier_default_actions_on_redirection_string_array" num="2"> <item value="1" /> <item value="4" /> </string-array>
电话框架加载这些配置并覆盖默认操作。
验证
此功能没有 CTS、CTS Verifier 或 GTS 测试。
使用这些手动验证测试来验证该功能
- 验证电信公司的设备余额不足信号通知。
- 验证在余额不足状态且 Wi-Fi 关闭期间的流量重定向限制。
- 验证在余额不足状态期间网络流量已关闭并且显示通知 UI。
- 验证在余额不足状态期间的语音通话/VoLTE 功能。
- 验证在余额不足状态下视频通话被阻止。
- 在 Wi-Fi 开启的情况下,验证用户可以继续浏览网页,并且浏览流量不会在余额不足状态下开启网络流量。
- 验证在余额不足状态期间的 Wi-Fi、WFC 和蓝牙功能。
- 关闭 Wi-Fi。验证余额不足通知 UI,以及普通浏览流量未重定向到电信公司注册网站。验证点击通知 UI 中的链接会将浏览器带到电信公司注册网站。
- 验证切换飞行模式不会重置流量限制状态。
- 验证交换正在使用的 SIM 卡会重置网络流量状态。
- 验证重新插入余额不足的 SIM 卡会重新启动流量重定向并再次获得网络流量限制。
- 验证重启手机会重新激活重定向并带回流量限制和通知 UI。
- 点按“强制门户”通知。验证是否建立了受限网络连接以允许用户充值。
- 验证 SIM 卡余额充值或重新激活会导致蜂窝网络流量恢复,并且电信公司链接和无余额通知消失。
- 数据服务恢复后的健全性测试。
默认应用提供了一些单元测试示例和一个运行它们的脚本(请参阅 tests/runtest.sh
)。当您实现自定义版本或行为时,您应该将这些自定义项镜像到专用单元测试中。