为余额不足的用户自定义设备行为

没有数据余额的 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;

注意:如果运营商实施了自己的独立应用,那么他们可以实施对本节中未提及的其他信号的支持。他们也可以定义和配置自己的操作。

默认信号操作映射

按照以下流程配置默认操作

  1. 为受支持的信号定义一个键。

    默认信号到操作的映射在 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";
  2. 将默认操作与信号键关联。

    默认操作 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 测试。

使用这些手动验证测试来验证该功能

  1. 验证电信公司的设备余额不足信号通知。
  2. 验证在余额不足状态且 Wi-Fi 关闭期间的流量重定向限制。
  3. 验证在余额不足状态期间网络流量已关闭并且显示通知 UI。
  4. 验证在余额不足状态期间的语音通话/VoLTE 功能。
  5. 验证在余额不足状态下视频通话被阻止。
  6. 在 Wi-Fi 开启的情况下,验证用户可以继续浏览网页,并且浏览流量不会在余额不足状态下开启网络流量。
  7. 验证在余额不足状态期间的 Wi-Fi、WFC 和蓝牙功能。
  8. 关闭 Wi-Fi。验证余额不足通知 UI,以及普通浏览流量未重定向到电信公司注册网站。验证点击通知 UI 中的链接会将浏览器带到电信公司注册网站。
  9. 验证切换飞行模式不会重置流量限制状态。
  10. 验证交换正在使用的 SIM 卡会重置网络流量状态。
  11. 验证重新插入余额不足的 SIM 卡会重新启动流量重定向并再次获得网络流量限制。
  12. 验证重启手机会重新激活重定向并带回流量限制和通知 UI。
  13. 点按“强制门户”通知。验证是否建立了受限网络连接以允许用户充值。
  14. 验证 SIM 卡余额充值或重新激活会导致蜂窝网络流量恢复,并且电信公司链接和无余额通知消失。
  15. 数据服务恢复后的健全性测试。

默认应用提供了一些单元测试示例和一个运行它们的脚本(请参阅 tests/runtest.sh)。当您实现自定义版本或行为时,您应该将这些自定义项镜像到专用单元测试中。