Проверка онлайн соединения всегда возвращает True

У меня в основной деятельности настроен динамический широковещательный приемник, который должен отображать сообщение Toast при каждом изменении состояния сети. Я подключаюсь онлайн, запускаю приложение "Вы в сети!" Появится сообщение с тостами, затем я выключу интернет на своем ноутбуке, вернусь к своему основному виду деятельности и продолжаю получать то же самое: "Вы онлайн!" Тост. Я проверяю свои операторы журнала и мой объект NetworkInfo продолжает возвращаться, что я действительно в сети, когда меня явно нет. Я пробовал это на моем эмуляторе и телефоне. Кто-нибудь знает почему?

Вот моя основная деятельность, которая содержит мой вложенный класс приемника широковещания, фильтры намерений и метод для выполнения тоста:

public class MainActivity extends AppCompatActivity {
private IntentFilter onlineIntentFilter;
private CheckOnlineReceiver checkOnlineReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    onlineIntentFilter = new IntentFilter();
    checkOnlineReceiver = new CheckOnlineReceiver();
    onlineIntentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);

    }


@Override
protected void onResume() {
    super.onResume();
    registerReceiver(checkOnlineReceiver, onlineIntentFilter);
}

@Override
protected void onPause() {
    super.onPause();
    unregisterReceiver(checkOnlineReceiver);
}


public void isNetworkAvailable() {
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = cm.getActiveNetworkInfo();
    Log.v("TAG", "NETWORK INFO =========== " + networkInfo);
    if (networkInfo != null && networkInfo.isConnected()) {
        Toast.makeText(this,"You Are Online!",Toast.LENGTH_LONG).show();
    }else{
        Toast.makeText(this,"You Are Not Online!",Toast.LENGTH_LONG).show();
    }
}
private class CheckOnlineReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        boolean stateChanged = (action.equals(ConnectivityManager.CONNECTIVITY_ACTION));
        if (stateChanged){
            isNetworkAvailable();
        }
    }
}}

2 ответа

Решение

Вот как я это сделаю:

private class CheckOnlineReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG, "onReceive action: " + intent.getAction());
        Log.d(TAG, "onReceive component: " + intent.getComponent());
        NetworkInfo networkInfo = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
        stateChanged = networkInfo != null && networkInfo.isConnectedOrConnecting();

    if (stateChanged) {
        Toast.makeText(this,"You Are Online!",Toast.LENGTH_LONG).show();
    }else{
        Toast.makeText(this,"You Are Not Online!",Toast.LENGTH_LONG).show();
       }
    }
}

Замените код получателя следующим:

registerReceiver(
            checkOnlineReceiver,
            new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)
    );

Вы пытались выключить WiFi на эмуляторе и посмотреть, что происходит? networkInfo.isConnected() не проверяет интернет. Это просто означает, что есть активное соединение.

Другие вопросы по тегам