Проверка онлайн соединения всегда возвращает 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()
не проверяет интернет. Это просто означает, что есть активное соединение.