Интернет-соединение в эмуляторе Android всегда отображает состояние подключения

Я попытался во многих отношениях проверить подключение к Интернету в своем эмуляторе Android.

  ConnectivityManager conMgr = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);  

   NetworkInfo info= conMgr.getActiveNetworkInfo();  

         if(info != null || info.isConnected()) {  
              Log.v("NetworkInfo","Connected State");  
         }  
        else{  
            Log.v("NetworkInfo","Not Connected state");  
            Log.v("Reason",info.getReason());  
        } 

даже если я отключу подключение к Интернету в своей системе, мой код, похоже, отображает состояние подключенного поэтому я догадался, что это может работать.

 if ( conMgr.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTED
        ||  conMgr.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED  ) {

      Log.v("Congr","Connection Present");

    }
    else if ( conMgr.getNetworkInfo(1).getState() == NetworkInfo.State.DISCONNECTED
        ||  conMgr.getNetworkInfo(0).getState() == NetworkInfo.State.DISCONNECTED) {

      Log.v("conMgr"," No Connection");

    } 

но приведенный выше код также отображает "Присутствие соединения" даже при отключении интернет-кабелей. .Пожалуйста, помогите найти правильный способ сделать это. У меня есть ACCESS_NETWORK_STATE и разрешение INTERNET в файле манифеста

Ответы

Ответ 1

1 Отключение интернет-кабелей не имеет значения. Используйте F8 для включения/выключения интернета в эмуляторе

2 В первом коде эта логика неверна:

if(info != null || info.isConnected()) {  
              Log.v("NetworkInfo","Connected State");  
         } 

Это должно быть:

if(info != null && info.isConnected()) {  
              Log.v("NetworkInfo","Connected State");  
         } 

Если вы используете || то это результат: a) когда информация равна null, сбой info.isConnected() b) когда информация не является нулевой, вы всегда будете показывать состояние подключенного

Однако, даже если вы исправите это, код не будет полностью правильным (см. 4)

3 Во втором коде эта логика неверна:

 else if ( conMgr.getNetworkInfo(1).getState() == NetworkInfo.State.DISCONNECTED
        ||  conMgr.getNetworkInfo(0).getState() == NetworkInfo.State.DISCONNECTED) {

      Log.v("conMgr"," No Connection");

    } 

должен быть:

 else {

      Log.v("conMgr"," No Connection");

    } 

Почему? Потому что есть больше состояний, чем CONNECTED и DISCONNECTED.

Однако, даже если вы исправите это, код не будет полностью правильным (см. 4)

4 Это работает на эмуляторе и устройствах.

connected = (   conMgr.getActiveNetworkInfo() != null &&
            conMgr.getActiveNetworkInfo().isAvailable() &&
            conMgr.getActiveNetworkInfo().isConnected()   )

Обратите внимание, что использование isAvailable - без этого isConnected может вернуть TRUE, когда WIFI отключен.

Надеюсь, это поможет!

Ответ 2

Собственно, это не говорит вам, подключен ли эмулятор к сети через хостинг-ПК. Если вы запустите его на ПК, а беспроводная сеть выключена, он все равно возвращает true, как только эмулятор думает, что он находится в онлайн-состоянии. Единственный способ, которым я смог точно определить, действительно ли эмулятор в сети, - попытаться извлечь страницу и посмотреть, успешно ли это или нет.