Предложите пользователю дополнительную услугу по нарезке сети

Нарезка сети 5G дает операторам связи возможность повысить производительность сети для конкретных случаев использования. В этом руководстве объясняется, как приложение может запустить процесс UX-распродажи и запросить премиум-соединение, если пользователь решит его приобрести.

UX-поток показывает пользователю уведомление, которое открывает веб-лист оператора связи, где он может совершить покупку.
Рисунок 1. Пример UX-потока дополнительных продаж.

Объявить намерения о расширенных возможностях

Чтобы запрос вашего приложения на сетевую возможность был удовлетворен, ваше приложение должно объявить о своем намерении запросить эту возможность в манифесте приложения. В противном случае сетевой запрос не выдаст 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. Проверьте, доступны ли возможности премиум-класса.

Вызовите метод API isPremiumCapabilityAvailableForPurchase() , чтобы определить, доступна ли выбранная премиум-возможность. Этот метод возвращает true , если возможность доступна для приобретения у оператора связи с использованием рабочего процесса уведомления о дополнительных продажах.

Шаг 2. Запустите поток уведомлений о дополнительных продажах.

После подтверждения доступности премиум-возможностей ваше приложение должно вызвать purchasePremiumCapability() чтобы инициировать поток уведомлений о дополнительных продажах. Если пользователь еще не приобрел указанную возможность и все предварительные условия выполнены, платформа показывает пользователю уведомление, сообщающее ему, что варианты повышения производительности могут быть доступны у его оператора связи. Если пользователь нажимает на уведомление, платформа открывает веб-просмотр оператора, чтобы можно было продолжить процесс покупки.

Обратный вызов parameter , переданный в purchasePremiumCapability() возвращает код результата для запроса на покупку.

Коды результатов PURCHASE_PREMIUM_CAPABILITY_RESULT_SUCCESS и PURCHASE_PREMIUM_CAPABILITY_RESULT_ALREADY_PURCHASED представляют собой успешные результаты, при которых ваше приложение может перейти к запросу выбранной расширенной возможности.

Коды результатов в следующем списке представляют собой неудачные запросы на покупку. Дополнительную информацию о них см. в справочнике по API.

Шаг 3. Запросите приобретенное премиум-соединение.

Если поток уведомлений о дополнительных продажах возвращает успешный код ( PURCHASE_PREMIUM_CAPABILITY_RESULT_SUCCESS или PURCHASE_PREMIUM_CAPABILITY_RESULT_ALREADY_PURCHASED ), ваше приложение должно использовать requestNetwork() для запроса сети, удовлетворяющей запрошенным возможностям. Обратите внимание, что при создании объекта NetworkRequest добавляемая вами возможность отличается от возможности, которую вы передаете API-интерфейсам TelephonyManager на предыдущих шагах. В следующей таблице константы класса TelephonyManager сопоставлены с соответствующими константами в NetworkCapabilities .

Константа TelephonyManager Константа NetworkCapabilities
PREMIUM_CAPABILITY_PRIORITIZE_LATENCY NET_CAPABILITY_PRIORITIZE_LATENCY

Если запрос на покупку не выполнен, ваше приложение должно вместо этого запросить и использовать сеть по умолчанию. Не существует автоматического резервного поведения, если запрос на премиум-срез не может быть выполнен.