it-roy-ru.com

Как вы проверяете интернет-соединение в Android?

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

Кто-нибудь может подсказать мне, как этого добиться?

58
UMAR

Вы можете использовать ConnectivityManager , чтобы проверить состояние сети.

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

if ( conMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED 
    || conMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.CONNECTED ) {

    // notify user you are online

}
else if ( conMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.DISCONNECTED 
    || conMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.DISCONNECTED) {

    // notify user you are not online
}

Обратите внимание, что константы ConnectivityManager.TYPE_MOBILE и ConnectivityManager.TYPE_WIFI представляют типы подключения, и эти два значения не являются исчерпывающими. Смотрите здесь для исчерпывающего списка.


Также убедитесь, что у вас есть необходимые разрешения для мониторинга состояния сети. Вам необходимо добавить это разрешение в ваш AndroidManifest.xml:

<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />
62
Dan

Только одно соединение может быть активным в любой точке. Итак, более простой ответ:

final ConnectivityManager conMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
final NetworkInfo activeNetwork = conMgr.getActiveNetworkInfo();
if (activeNetwork != null && activeNetwork.isConnected()) {
    // notify user you are online
} else {
    // notify user you are not online
} 

Он также обслуживает любой новый тип сети, такой как ConnectivityManager # TYPE_WIMAX


Также убедитесь, что у вас есть необходимые разрешения для мониторинга состояния сети. Вам необходимо добавить это разрешение в ваш AndroidManifest.xml:

<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />
124
William

Вы можете сделать это для различных типов состояния сети

public void  checkNetworkStatus(){

    final ConnectivityManager connMgr = (ConnectivityManager)
     this.getSystemService(Context.CONNECTIVITY_SERVICE);

     final Android.net.NetworkInfo wifi =
     connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

     final Android.net.NetworkInfo mobile =
     connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

     if( wifi.isAvailable() ){

     Toast.makeText(this, "Wifi" , Toast.LENGTH_LONG).show();
     }
     else if( mobile.isAvailable() ){

     Toast.makeText(this, "Mobile 3G " , Toast.LENGTH_LONG).show();
     }
     else
     {

         Toast.makeText(this, "No Network " , Toast.LENGTH_LONG).show();
     }

}
10
mainu

Вы можете проверить покрытие сети и доступность данных Mobile и Wi-Fi напрямую с

Для Покрытие сети доступность,

private boolean isNetworkAvailable()
{
 ConnectivityManager conxMgr = (ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE);

 NetworkInfo mobileNwInfo = conxMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
 NetworkInfo wifiNwInfo   = conxMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

return ((mobileNwInfo== null ? false : mobileNwInfo.isAvailable()) || (wifiNwInfo == null ? false : wifiNwInfo.isAvailable()));

}

Для Доступность данных если сеть доступна 

private boolean isDataAvailable()
{
  ConnectivityManager conxMgr = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);

 NetworkInfo mobileNwInfo = conxMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
 NetworkInfo wifiNwInfo   = conxMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

return ((mobileNwInfo== null? false : mobileNwInfo.isConnected() )|| (wifiNwInfo == null? false : wifiNwInfo.isConnected()));
}
6
Amar Gore

Коррекция

if ( conMgr.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED 
    ||  conMgr.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTING  ) {
   //notify user you are online
}

должно быть

if ( conMgr.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED 
    ||  conMgr.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTED ) {
    //notify user you are online
}
5
Sudhakar Chavali

Зарегистрируйте приемник вещания в handle CONNECTIVITY_ACTION. Смотрите это полный пример . Вам следует обновить статическую переменную «connectionAvailable», которая будет доступна везде и всегда через соответствующий метод получения.

Не забудьте объявить получателя широковещания в файле manifest:

<receiver Android:name=".NetworkConnectivityReceiver" Android:enabled="true">
    <intent-filter>
        <action Android:name="Android.net.conn.CONNECTIVITY_CHANGE"/>
    </intent-filter>
</receiver>

Что касается «проверки каждого действия», возможно, вам будет интересно использовать BaseActivity, расширенную вашими действиями, а также управлять тестом подключения и отображать сообщение.

Также обратите внимание, что использование событий (не опрос из действий) будет более эффективным.

3
caligari

Вы не используете ConnectivityManager.getNetworkInfo(0).getState() и ConnectivityManager.getNetworkInfo(1).getState() правильно, вместо жесткого кодирования значений (1) и (0) используйте ConnectivityManager.TYPE_WIFI и ConnectivityManager.TYPE_MOBILE

1
Naskov

Это логическая проверка, чтобы увидеть, есть ли у вас доступ к сети. Он не определяет, какой тип доступа к сети - мобильный, Wi-Fi ..., он просто проверяет, если вы находитесь в сети.

boolean mobileNwInfo = false;  
ConnectivityManager conxMgr = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);  
try { mobileNwInfo = conxMgr.getActiveNetworkInfo().isConnected(); }  
catch (NullPointerException e) { mobileNwInfo = false; }  
if ( mobileNwInfo == false ) {
  // Your code goes here...
}  
0
VikingGlen