Принудительно использовать сотовую связь на Android при подключении к Wi-Fi

У меня есть диагностическое устройство, которое также действует как точка доступа Wi-Fi. Любое устройство может подключиться к этой точке доступа и запросить информацию с устройства. Очевидно, что устройство не предоставляет доступ в Интернет через эту сеть.

Я попытался создать приложение для Android, которое запрашивает информацию с устройства, используя предоставленную сеть Wi-Fi, а затем загружает данные на какой-то сервер в Интернете с помощью сотового соединения.

Однако Android, похоже, отключает сотовое соединение всякий раз, когда подключена сеть Wi-Fi. Поскольку сеть Wi-Fi не подключена к Интернету, данные не могут быть загружены, и приложение бесполезно.

До сих пор я пытался использовать ConnectivityManager для запроса мобильной сети и привязки ее к моему коммуникационному сокету. Кроме того, я попытался перебрать все сетевые интерфейсы и привязать коммуникационный сокет к IP-адресу сотового интерфейса. Однако оба запроса завершились неудачно, поскольку мне не удалось запросить интерфейс сотовой сети из приложения.

Как мне удалось перенаправить данные с устройства в сети Wi-Fi на какой-либо сервер через сотовое подключение к Интернету?


person Emiswelt    schedule 12.03.2015    source источник


Ответы (2)


Я отправил отчет об этой проблеме.

Проблема должна быть исправлена ​​в версии Android 5.1.0.

person Emiswelt    schedule 21.03.2015

Вот правильный пример кода.

NetworkRequest cellularRequest = new NetworkRequest.Builder()
        .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
        .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET).build();
if (connectivityManager != null) {
    connectivityManager.requestNetwork(cellularRequest, new ConnectivityManager.NetworkCallback() {
        @Override
        public void onAvailable(@NonNull Network network) {
            super.onAvailable(network);
            // do request with the network
            OkHttpClient.Builder builder = new OkHttpClient.Builder();
            builder.socketFactory(network.getSocketFactory());
            OkHttpClient client = builder.build();
            Call call = client.newCall(request);
            Response response = call.execute();

            // do remove callback. if you forget to remove it, you will received callback when cellular connect again.
            connectivityManager.unregisterNetworkCallback(this);
        }

        @Override
        public void onUnavailable() {
            super.onUnavailable();
            // do remove callback
            connectivityManager.unregisterNetworkCallback(this);
        }
    });
}
person ReadyShow    schedule 14.11.2019