向用户提供广告网络切片追加销售

5G 网络切片 运营商将能够针对特定用途提升网络性能 案例本指南介绍了应用如何触发网络切片追加销售用户体验 流程,并在用户决定购买高级连接时请求高级连接。

用户体验流程会向用户显示打开运营商的通知
       网页。
图 1. 追加销售用户体验流程示例。

声明高级功能 intent

为了让您的应用对网络功能的请求得到采纳,您的应用 必须在应用清单中声明其 intent 以请求该功能。 否则,网络请求会失败抛出 SecurityException

为此,您的应用必须声明 PackageManager.PROPERTY_SELF_CERTIFIED_NETWORK_CAPABILITIES 属性,并在 AndroidManifest.xml 文件中添加相应的 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>

触发网络切片追加销售流程

此代码示例演示了如何触发追加销售流程并请求 购买高级功能。

Context mContext;
Network mNetwork;

public void purchasePremiumCapability() {
    TelephonyManager tm = mContext.getSystemService(TelephonyManager.class);
    int capability = TelephonyManager.PREMIUM_CAPABILITY_PRIORITIZE_LATENCY;
    if (tm.isPremiumCapabilityAvailableForPurchase(capability)) {
        tm.purchasePremiumCapability(capability, Runnable::run, new Consumer<Integer>() {
            @Override
            public void accept(Integer result) {
                Log.d("Purchase premium capability result: "
                        + TelephonyManager.convertPurchaseResultToString(result));
                switch (result) {
                    case /* success or already purchased */:
                        requestPremiumCapabilityNetwork();
                        break;
                    case /* temporary failure */:
                        // TODO: wait and retry
                        break;
                    case /* hard failure */:
                        // TODO: handle failure
                        break;
                    default:
                        Log.e("Unknown purchase result: " + result);
                }
            }
        });
    } else {
        Log.e("Premium capability is not available for purchase.");
    }
}

public void requestPremiumCapabilityNetwork() {
    ConnectvityManager cm = mContext.getSystemService(ConnectivityManager.class);
    NetworkRequest request = NetworkRequest.Builder()
            .addCapability(NetworkCapabilities.NET_CAPABILITY_PRIORITIZE_LATENCY)
            .build();
    cm.requestNetwork(request, new NetworkCallback() {
        @Override
        public void onAvailable(Network network) {
            Log.d("Application can now use the network with the premium capability.");
            mNetwork = network;
        }

        @Override
        public void onLost(Network network) {
            Log.d("Premium capability network is no longer available.");
            mNetwork = null;
            // TODO: clean up anything relying on the premium capability network
        }
    });
}

以下几部分将介绍此流程中涉及的步骤, 。

第 1 步:验证高级功能是否可用

调用 isPremiumCapabilityAvailableForPurchase() API 方法来确定 选定的高级功能是否可用。此方法会返回 true 如果该功能可供使用追加销售的运营商购买 通知工作流。

第 2 步:启动追加销售通知流程

确认高级功能可用后,您的应用应调用 purchasePremiumCapability() 以便启动追加销售通知流程如果用户尚未购买 指定功能且所有前提条件均得到满足,则平台 向用户显示一条通知,告诉他们性能提升选项 运营商可能会提供相应服务。如果用户点按通知, 平台会打开运营商的网页视图,以便继续购买流程。

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

结果代码 PURCHASE_PREMIUM_CAPABILITY_RESULT_SUCCESSPURCHASE_PREMIUM_CAPABILITY_RESULT_ALREADY_PURCHASED 代表成功的结果,在此结果中,您的应用可以继续请求 精选的高级功能

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

第 3 步:请求购买的 Premium 连接

如果追加销售通知流程返回成功代码 (PURCHASE_PREMIUM_CAPABILITY_RESULT_SUCCESSPURCHASE_PREMIUM_CAPABILITY_RESULT_ALREADY_PURCHASED),您的应用应使用 requestNetwork() 来请求满足所请求功能的网络。请注意,当您 构建 NetworkRequest 对象后,您添加的功能会不相同 您在前面的步骤中传递给 TelephonyManager API 的功能。 下表将常量从 TelephonyManager 类映射到 NetworkCapabilities 中的对应常量。

TelephonyManager 常量 NetworkCapabilities 常量
PREMIUM_CAPABILITY_PRIORITIZE_LATENCY NET_CAPABILITY_PRIORITIZE_LATENCY

如果购买请求失败,您的应用应请求并使用默认的 网络。如果高级切片 请求。