借助 5G 网络切片,运营商能够为特定用例提升网络性能。本指南介绍了应用如何使用网络切片功能。
本指南还介绍了在应用需要先购买才能访问高级连接的情况下,如何触发网络切片追加销售用户体验流程。
第 1 步:声明付费功能 intent
为了让系统能够执行您的应用对高级切片功能的请求,您的应用必须在应用清单中声明其请求该功能的意图。否则,网络请求将失败并抛出 SecurityException
。
为此,您的应用必须在 AndroidManifest.xml
文件中声明 PackageManager.PROPERTY_SELF_CERTIFIED_NETWORK_CAPABILITIES
属性,并添加相应的 XML 资源文件。
清单文件中的 capability 声明如下所示:
<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
对象时,您添加的 capability 与传递给 TelephonyManager
API 的 capability 不同。下表将 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()
以启动追加销售通知流程。如果用户尚未购买指定功能且满足所有前提条件,平台会向用户显示一条通知,告知他们运营商可能提供性能提升选项。如果用户点按通知,平台会打开运营商的 WebView,以便继续购买流程。
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_SUCCESS
和 PURCHASE_PREMIUM_CAPABILITY_RESULT_ALREADY_PURCHASED
表示成功结果,您的应用可以继续请求所选的付费功能。
下表中的结果代码表示购买请求失败。如需详细了解这些 API,请参阅 API 参考文档。
PURCHASE_PREMIUM_CAPABILITY_RESULT_ALREADY_IN_PROGRESS
PURCHASE_PREMIUM_CAPABILITY_RESULT_CARRIER_DISABLED
PURCHASE_PREMIUM_CAPABILITY_RESULT_CARRIER_ERROR
PURCHASE_PREMIUM_CAPABILITY_RESULT_ENTITLEMENT_CHECK_FAILED
PURCHASE_PREMIUM_CAPABILITY_RESULT_FEATURE_NOT_SUPPORTED
PURCHASE_PREMIUM_CAPABILITY_RESULT_NETWORK_NOT_AVAILABLE
PURCHASE_PREMIUM_CAPABILITY_RESULT_NOT_DEFAULT_DATA_SUBSCRIPTION
PURCHASE_PREMIUM_CAPABILITY_RESULT_NOT_FOREGROUND
PURCHASE_PREMIUM_CAPABILITY_RESULT_PENDING_NETWORK_SETUP
PURCHASE_PREMIUM_CAPABILITY_RESULT_REQUEST_FAILED
PURCHASE_PREMIUM_CAPABILITY_RESULT_THROTTLED
PURCHASE_PREMIUM_CAPABILITY_RESULT_TIMEOUT
PURCHASE_PREMIUM_CAPABILITY_RESULT_USER_CANCELED
如果购买请求失败,您的应用可能会改用默认网络。如果无法满足高级 slice 请求,则不会自动回退。
切片追加销售的用户体验流程
![用户体验流程会向用户显示一条通知,用于打开运营商工作表,以便用户在其中完成购买交易。](https://developer.android.com/static/images/develop/connectivity/5g/upsell-ux-flow.png?hl=zh-cn)