Как проверить, подключены ли и мобильные данные, и Wi-Fi? - PullRequest
0 голосов
/ 18 июня 2020

У меня есть этот код:

ConnectivityManager connMgr = (ConnectivityManager)
  context.getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkInfo networkInfoWifi =
  connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

NetworkInfo networkInfoMobileData =
  connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

И затем в моих Android сетевых настройках включены как мобильные данные, так и WiFi. Следующие проверки:

networkInfoWifi.isConnected();       // results to TRUE
networkInfoMobileData.isConnected(); // results to FALSE

Мое приложение работает на Android Lollipop. Я ожидаю, что обе проверки, указанные выше, должны вернуть TRUE. Почему это происходит? Мне нужно, чтобы они оба были ИСТИННЫМИ. Что делать?

Ответы [ 2 ]

0 голосов
/ 25 июня 2020

Я так и не нашел способ заставить networkInfoWifi.isConnected() и networkInfoMobileData.isConnected() возвращать оба значения ИСТИНА. Вероятно, это связано с тем, что Android может быть подключено только к одному интерфейсу одновременно.

Этот выбор интерфейса также выполняется Android автоматически запускающими устройства Lollipop. Android Lollipop по умолчанию использует мобильные данные, если Wi-Fi не имеет доступа к Inte rnet?

0 голосов
/ 19 июня 2020

ConnectivityManager.getNetworkInfo() - устаревший метод.

Правильнее будет сделать ConnectivityManager.NetworkCallback

Чтобы ответить на ваш вопрос, проверяя, подключены ли вы к inte rnet через Wi-Fi или мобильные данные:

    ConnectivityManager connMgr = (ConnectivityManager) 
    getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkRequest request = new NetworkRequest.Builder()
            .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
            .build();

    connMgr.requestNetwork(request, new ConnectivityManager.NetworkCallback() {

        // This callback is invoked when there is a valid Mobile Data or WiFi network 
        // but is later lost during the course of using the application.
        @Override
        public void onAvailable(@NonNull Network network) {
            super.onAvailable(network);
        }


        // This callback is invoked when there is a valid Mobile Data or WiFi network 
        // that is ready for use
        @Override
        public void onLost(@NonNull Network network) {
            super.onLost(network);
        }


        // This callback is invoked when there is no valid Mobile Data or WiFi network 
        // after a specific timeout has timed out.
        @Override
        public void onUnavailable() {
            super.onUnavailable();
        }
    });

Существуют различные другие обратные вызовы, но я считаю, что для вашего варианта использования это основные из них, которые вам понадобятся. Наконец, чтобы добавить указанный c тайм-аут, который был упомянут в обратном вызове onUnavailable, вы можете использовать этот конструктор для своего ConnectivityManager.NetworkCallback:

ConnectivityManager.NetworkCallback(int timeoutMs)

Я действительно надеюсь, что это поможет. Дополнительную информацию об API см. Здесь

...