Как вы проверяете интернет-соединение в Android?
Я хочу проверить подключение к Интернету в каждой деятельности. Если оно потеряно, должно появиться сообщение.
Кто-нибудь может подсказать мне, как этого добиться?
8 ответов
Вы можете использовать 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" />
Только одно соединение может быть активным в любой точке. Итак, более простой ответ:
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" />
Вы можете сделать это для различных типов состояния сети
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();
}
}
Вы можете проверить покрытие сети и доступность данных 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()));
}
Коррекция
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
}
Зарегистрируйте широковещательный приемник для обработки CONNECTIVITY_ACTION. Смотрите этот полный пример. Вам следует обновить статическую переменную "connectionAvailable", которая будет доступна везде и всегда через соответствующий метод получения.
Не забудьте объявить получателя вещания в файле манифеста:
<receiver android:name=".NetworkConnectivityReceiver" android:enabled="true">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
Что касается "проверки каждого действия", возможно, вам будет интересно использовать BaseActivity, расширенную вашими действиями, а также управлять тестом подключения и отображать сообщение.
Кроме того, обратите внимание, что использование событий (не опрос из действий) будет более эффективным.
Вы не используете ConnectivityManager.getNetworkInfo(0).getState()
а также ConnectivityManager.getNetworkInfo(1).getState()
правильно, вместо жесткого кодирования значений (1) и (0) используйте ConnectivityManager.TYPE_WIFI
а также ConnectivityManager.TYPE_MOBILE
Это логическая проверка, чтобы увидеть, есть ли у вас доступ к сети. Он не определяет, какой тип доступа к сети - мобильный, 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...
}