ConnectivityManager Networkcallback не перехватывает соединение с сетью Wi-Fi без подключения к интернету

У меня есть устройство, к которому мое приложение может подключиться через WIFI, но на устройстве нет Интернета. Я реализовал NetworkCallback для отслеживания изменений в подключении как таковых:

public class ConnectivityNetworkCallback extends ConnectivityManager.NetworkCallback{

        @Override
        public void onAvailable(android.net.Network network) {
            super.onAvailable(network);

            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
                mConnectivityManager.bindProcessToNetwork(network);
            else
                ConnectivityManager.setProcessDefaultNetwork(network);

            NetworkInfo networkInfo = mConnectivityManager.getActiveNetworkInfo();
            int connectionType = networkInfo.getType();
            Log.e("networkCallback", "connectionType: " + networkInfo.getTypeName());
            switch(connectionType){

                case ConnectivityManager.TYPE_WIFI:
                    String networkName = networkInfo.getExtraInfo().substring(1,networkInfo.getExtraInfo().length()-1);

                    Log.e("networkCallback","network type wifi, extra: " + networkName);

                    break;
                case ConnectivityManager.TYPE_MOBILE:
                    Log.e("networkCallback","network type mobile, extra:  " + networkInfo.getExtraInfo());
                    break;
            }
        }

        @Override
        public void onLost(android.net.Network network) {
            super.onLost(network);

            Log.e("networkCallback", "losing active connection");
        }
}

Когда мои Wi-Fi и мобильные данные включены, и я переключаюсь между различными сетями Wi-Fi с доступом к Интернету, "onAvailable()" запускает и печатает, чтобы регистрировать, что я подключен через Wi-Fi. Как только я пытаюсь подключиться к сети Wi-Fi без интернета, метод onAvailable () запускает и печатает, что я подключен через мобильное устройство, а также устройство показывает восклицательный знак рядом со значком Wi-Fi.

Есть ли способ, которым я все еще могу поймать случай, когда я подключен к сети Wi-Fi без интернета?

3 ответа

Я боролся с той же проблемой. Что, кажется, работает для меня сейчас, так это сначала получить сетевые возможности:

      connectivityManager.getNetworkCapabilities(network)

А затем проверьте, есть ли у соединения интернет и проверено ли:

      private val NetworkCapabilities.hasInternet
    get() = hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && when {
        Build.VERSION.SDK_INT >= Build.VERSION_CODES.M -> hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
        else -> true
    }

К сожалению, NetworkCapabilities.NET_CAPABILITY_VALIDATEDфлаг был введен только в API 23, поэтому в этом случае я его игнорирую.

Вы должны зарегистрироваться для обратного вызова по сети с помощью Connectivity Manager.

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

NetworkRequestBuilder.Builder builder = new NetworkRequest.Builder()
//Use builder to set custom network parameter
connMgr.requestNetwork(builder.build(),new ConnectivityNetworkCallback())

Создать утилиты

public class CheckInternet extends AsyncTask<Void,Void,Boolean> {

private Consumer mConsumer;
public  interface Consumer { void accept(Boolean internet); }

public  CheckInternet(Consumer consumer) { mConsumer = consumer; execute(); }

@Override protected Boolean doInBackground(Void... voids) { try {
    Socket sock = new Socket();
    sock.connect(new InetSocketAddress("8.8.8.8", 53), 1500);
    sock.close();
    return true;
} catch (IOException e) { return false; } }

@Override protected void onPostExecute(Boolean internet) { mConsumer.accept(internet); }

}

Используйте этот метод для проверки интернет-соединения

 new InternetCheck(internet -> {
    if (internet){
        check your condition
    }else {
        //error message
    }
Другие вопросы по тегам