使用网络切片

5G 网络切片使运营商能够为特定用例提供网络性能提升。本指南介绍了应用如何使用网络切片功能。

本指南还介绍了在应用访问高级连接之前需要购买的情况下,如何触发 网络切片升级 UX 流程

第 1 步:声明高级能力意图

为了使您的应用对高级切片能力的请求得到响应,您的应用必须在应用清单中声明其请求该能力的意图。否则,网络请求将失败,并抛出 SecurityException

为此,您的应用必须在 AndroidManifest.xml 文件中声明 PackageManager.PROPERTY_SELF_CERTIFIED_NETWORK_CAPABILITIES 属性,并包含相应的 XML 资源文件。

清单文件中的能力声明如下所示

<property android:name="android.net.PROPERTY_SELF_CERTIFIED_NETWORK_CAPABILITIES"
          android:resource="@xml/network_capabilities" />

相应的 network_capabilities.xml 资源文件如下所示

<network-capabilities-declaration> xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-network-capability android:name="NET_CAPABILITY_PRIORITIZE_LATENCY"/>
</network-capabilities-declaration>

第 2 步:验证高级能力是否可用

调用 requestNetwork() API 方法来确定高级能力是否可用。

Context mContext;
Network mNetwork;

public void requestPremiumCapabilityNetwork(@NetCapability int capability) {
    ConnectvityManager cm = mContext.getSystemService(ConnectivityManager.class);
    NetworkRequest request = NetworkRequest.Builder()
            .addCapability(capability)
            .build();
    cm.requestNetwork(request, new NetworkCallback() {
        @Override
        public void onAvailable(Network network) {
            log("Premium capability %d network is available.", capability);
            mNetwork = network;
        }

        @Override
        public void onLost(Network network) {
            log("Premium capability %d network is not available.", capability);
            mNetwork = null;
        }
    });
}

构建 NetworkRequest 对象时,您添加的能力与传递给 TelephonyManager API 的能力不同。下表将 TelephonyManager 类中的常量映射到 NetworkCapabilities 中的相应常量。

TelephonyManager 常量 NetworkCapabilities 常量
PREMIUM_CAPABILITY_PRIORITIZE_LATENCY NET_CAPABILITY_PRIORITIZE_LATENCY

第 3 步:如果高级能力不可用,检查是否可购买

调用 isPremiumCapabilityAvailableForPurchase() API 方法来确定所选高级能力是否可用。如果该能力可供运营商通过升级通知流程购买,此方法将返回 true

Context mContext;

public boolean isPremiumCapabilityAvailableForPurchase(@PremiumCapability int capability) {
    TelephonyManager tm = mContext.getSystemService(TelephonyManager.class);
    boolean isAvailable = tm.isPremiumCapabilityAvailableForPurchase(capability);
    log("Premium capability %d %s available to purchase.",
            capability,
            isAvailable ? "is" : "is not");
    return isAvailable;
}

第 4 步:启动升级通知流程

确认高级能力可用后,您的应用应调用 purchasePremiumCapability() 来启动升级通知流程。如果用户尚未购买指定能力且满足所有前置条件,平台会向用户显示通知,告知他们运营商可能提供性能提升选项。如果用户点按该通知,平台会打开运营商的网页视图,以便继续购买流程。

Context mContext;

public void purchasePremiumCapability(@PremiumCapability int capability) {
    TelephonyManager tm = mContext.getSystemService(TelephonyManager.class);
    tm.purchasePremiumCapability(capability, Runnable::run, new Consumer<Integer>() {
        @Override
        public void accept(Integer result) {
            log("Purchase premium capability %d result: %d", capability, result);
            int purchaseResult = result;
        }
    });
}

传递给 purchasePremiumCapability()parameter 回调会返回购买请求的结果代码。

结果代码 PURCHASE_PREMIUM_CAPABILITY_RESULT_SUCCESSPURCHASE_PREMIUM_CAPABILITY_RESULT_ALREADY_PURCHASED 表示成功结果,您的应用可以继续请求所选高级能力。

以下列表中的结果代码表示购买请求失败。请参阅 API 参考文档了解详情。

如果购买请求失败,您的应用可以使用默认网络。如果无法满足高级切片请求,则没有自动回退行为。

切片升级的 UX 流程

The UX flow shows the user a notification that opens up a carrier
       websheet where they can complete the purchase.