La segmentación de redes 5G les permite a los operadores proporcionar aumentos de rendimiento de la red para casos de uso específicos. En esta guía, se explica cómo una app puede usar la función de división de red.
En esta guía, también se explica cómo activar el flujo de UX de venta incremental de división de red en los casos en que se requiere una compra para que la app pueda acceder a la conexión premium.
Paso 1: Declara intents de funciones premium
Para que se acepte la solicitud de tu app para una función de división premium, esta debe declarar su intención de solicitar esa función en el manifiesto de la app.
De lo contrario, la solicitud de red fallará y arrojará un SecurityException
.
Para ello, tu app debe declarar la propiedad PackageManager.PROPERTY_SELF_CERTIFIED_NETWORK_CAPABILITIES
en el archivo AndroidManifest.xml
y, además, incluir un archivo de recursos XML correspondiente.
Una declaración de capabilities en el archivo de manifiesto se ve de la siguiente manera:
<property android:name="android.net.PROPERTY_SELF_CERTIFIED_NETWORK_CAPABILITIES"
android:resource="@xml/network_capabilities" />
El archivo de recursos network_capabilities.xml
correspondiente se ve de la siguiente manera:
<network-capabilities-declaration> xmlns:android="http://schemas.android.com/apk/res/android">
<uses-network-capability android:name="NET_CAPABILITY_PRIORITIZE_LATENCY"/>
</network-capabilities-declaration>
Paso 2: Verifica si la función premium está disponible
Llama al método de la API requestNetwork()
para determinar si la función premium está disponible.
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;
}
});
}
Cuando compilas un objeto NetworkRequest
, la capability que agregas no es la misma que pasas a las APIs de TelephonyManager
.
En la siguiente tabla, se asignan las constantes de la clase TelephonyManager
a las constantes correspondientes en NetworkCapabilities
.
Constante TelephonyManager |
Constante NetworkCapabilities |
---|---|
PREMIUM_CAPABILITY_PRIORITIZE_LATENCY |
NET_CAPABILITY_PRIORITIZE_LATENCY |
Paso 3: Si la función premium no está disponible, verifica la disponibilidad para comprarla
Llama al método de la API isPremiumCapabilityAvailableForPurchase()
para determinar si la función premium seleccionada está disponible.
Este método muestra true
si la función está disponible para la compra al operador mediante el flujo de trabajo de notificación de venta incremental.
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;
}
Paso 4: Inicia el flujo de notificaciones de venta incremental
Después de confirmar que la función premium está disponible, tu app debe llamar a purchasePremiumCapability()
para iniciar el flujo de notificaciones de venta incremental. Si el usuario aún no compró la función especificada y se cumplen todas las condiciones previas, la plataforma le muestra una notificación para informarle que es posible que su operador tenga disponibles opciones para mejorar el rendimiento. Si el usuario presiona la notificación, la plataforma abre el WebView del operador para que el proceso de compra pueda continuar.
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;
}
});
}
La devolución de llamada de parameter
que se pasa a purchasePremiumCapability()
muestra un código de resultado para la solicitud de compra.
Los códigos de resultado PURCHASE_PREMIUM_CAPABILITY_RESULT_SUCCESS
y PURCHASE_PREMIUM_CAPABILITY_RESULT_ALREADY_PURCHASED
representan resultados correctos en los que tu app puede continuar solicitando la función premium seleccionada.
Los códigos de resultado de la siguiente lista representan solicitudes de compra que no se pudieron realizar. Consulta la referencia de la API para obtener más información al respecto.
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
Si la solicitud de compra falla, es posible que tu app use la red predeterminada. No hay un comportamiento de resguardo automático si no se puede completar la solicitud de fragmento premium.
Flujo de UX para la venta incremental de porciones
![El flujo de UX muestra al usuario una notificación que abre una hoja web del operador en la que puede completar la compra.](https://developer.android.com/static/images/develop/connectivity/5g/upsell-ux-flow.png?hl=es-419)