2010-02-24 5 views
57

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

Может ли кто-нибудь посоветовать мне, как этого достичь?

+0

Это может помочь некоторым http://www.gadgetsaint.com/android/no-internet-connectivity-android/ – ASP

ответ

61

Вы можете использовать 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 представляют типы соединений и эти два значения не являются исчерпывающими. См. here для исчерпывающего списка.


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

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
+0

это дает мне следующее сообщение об ошибке ConnectivityService: Ни пользователь, ни 10026 текущий процесс не имеет android.permission.ACCESS_NETWORK_STATE. на conMgr.getNetworkInfo – UMAR

+28

Вы должны добавить эту строку в AndroidManifest.xml: <использует-разрешение андроида: имя = «android.permission.ACCESS_NETWORK_STATE»>

+2

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

5

Коррекция

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 
} 
+1

Хорошо, что одна вещь, которую я заметил ... когда Wi-Fi подключен к беспроводному модему Интернет-покрытие есть или нет, он всегда говорит, что да, вы подключены, он проверяет только совместимость Wi-Fi, а не подключение к Интернету, поэтому как справиться с такой ситуацией ? – UMAR

120

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

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" /> 
+2

Лучший ответ. +1 –

+0

Существует имя метода 'isConnected()' для сетевой информации, которое может заменить вашу строку '.getState() == ...' и сделать ее еще проще? – bytebender

+0

Nice pick up #bytebender. Я внесла поправки в решение. Еще проще :-) – William

10

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

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(); 
    } 

} 
6

Вы можете проверить покрытие сети и доступность данных Mobile и плетеным фи непосредственно

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

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())); 
} 
1

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

0

Это логическое проверьте, есть ли у вас доступ к сети. Он не определяет, какой вид доступа к сети - мобильный, 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... 
} 
3

Зарегистрируйте широковещательный приемник к ручкой CONNECTIVITY_ACTION. См. Это full example.Вы должны обновить статическую переменную 'connectionAvailable', которая будет доступна везде и каждый раз через соответствующий получатель.

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

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

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

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