Как получить изменение состояния сети на Android?
У меня есть широковещательный приемник для "CONNECTIVITY_CHANGE". Когда я печатаю лишнее, используя это:
intent.getExtras().toString()
Я вижу, что если я отключу WIFI, я получу 2 сетевых изменения.
- WIFI ОТКЛЮЧЕН
- МОБИЛЬНЫЙ ПОДКЛЮЧЕН
Тем не менее, когда я пытаюсь использовать
NetworkInfo networkInfo = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
Он сказал, что этот API устарел. После этого я попытался использовать это
int networkType = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_TYPE);
NetworkInfo networkInfo = connectivityManager.getNetworkInfo(networkType);
Однако getNetworkInfo также устарела.
Единственный вариант, который мне дали, - это использовать getActiveNetworkInfo или getActiveNetwork.
Если я использую это, я получу 2 трансляции, которые дадут мне ту же информацию о сети.
Есть ли лучший способ обработки состояния сети в Android?
ДОПОЛНИТЕЛЬНОЕ ПРИМЕЧАНИЕ:
Спасибо за быстрый ответ, но я не ищу способ проверить, есть ли у меня подключение к интернету или нет.
Мне нужно знать, какая сеть была отключена и подключена. Изменение состояния сети - это то, что я ищу.
6 ответов
Вот простой фрагмент кода, который поможет вам определить, какое подключение к Интернету имеет пользователь на своем устройстве.
Сначала нам нужно следующее разрешение для доступа к состоянию сети. Добавьте следующее разрешение в ваш файл AndroidManifest.xml.
Разрешения, необходимые для доступа к состоянию сети:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Теперь проверьте следующую утилиту класса NetworkUtil. У него есть метод getConnectivityStatus, который возвращает константу int в зависимости от текущего сетевого подключения. Если Wi-Fi включен, этот метод вернет TYPE_WIFI. Аналогично для мобильной сети передачи данных возвращается TYPE_MOBILE. У тебя есть идея!!
Существует также метод getConnectivityStatusString, который возвращает текущее состояние сети в виде более читаемой строки.
Создайте класс NetworkUtil.java и вставьте следующий код:
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
public class NetworkUtil {
public static int TYPE_WIFI = 1;
public static int TYPE_MOBILE = 2;
public static int TYPE_NOT_CONNECTED = 0;
public static int getConnectivityStatus(Context context) {
ConnectivityManager cm = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
if (null != activeNetwork) {
if(activeNetwork.getType() == ConnectivityManager.TYPE_WIFI)
return TYPE_WIFI;
if(activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE)
return TYPE_MOBILE;
}
return TYPE_NOT_CONNECTED;
}
public static String getConnectivityStatusString(Context context) {
int conn = NetworkUtil.getConnectivityStatus(context);
String status = null;
if (conn == NetworkUtil.TYPE_WIFI) {
status = "Wifi enabled";
} else if (conn == NetworkUtil.TYPE_MOBILE) {
status = "Mobile data enabled";
} else if (conn == NetworkUtil.TYPE_NOT_CONNECTED) {
status = "Not connected to Internet";
}
return status;
}
}
Вы можете использовать этот класс утилит в своем приложении для Android, чтобы в любой момент проверить состояние сети устройства.
Broadcast Receiver для обработки изменений в состоянии сети
Вы можете легко справиться с изменениями в состоянии сети, создав собственный Broadcast Receiver. Ниже приведен класс приемника вещания, где мы обрабатываем изменения в сети.
Проверьте метод onReceive(). Этот метод будет вызываться при изменении состояния сети. Здесь мы просто создаем сообщение Toast и отображаем текущее состояние сети. Вы можете написать свой собственный код здесь для обработки изменений в состоянии соединения.
Создайте класс NetworkChangeReceiver.java и вставьте следующий код:
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, final Intent intent) {
String status = NetworkUtil.getConnectivityStatusString(context);
Toast.makeText(context, status, Toast.LENGTH_LONG).show();
}
}
Как только мы определим наш BroadcastReceiver, нам нужно определить то же самое в файле AndroidMenifest.xml. Добавьте следующее в ваш файл манифеста.
<application ...>
...
<receiver
android:name="YOUR PACKAGE NAME"
android:label="NetworkChangeReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
</intent-filter>
</receiver>
...
</application>
Мы определили наш класс приемника вещания в файле манифеста. Также мы определили два намерения CONNECTIVITY_CHANGE и WIFI_STATE_CHANGED. Таким образом это зарегистрирует наш получатель для данных намерений. Всякий раз, когда происходит изменение в состоянии сети, Android запустит эти намерения, и будет вызван наш широковещательный приемник.
Вот и все, запустите ваш код. Надеюсь, это служит вашей цели!
Используйте приведенный ниже код и проверьте текущее состояние подключения к сети
public class NetworkStateReceiver extends BroadcastReceiver {
Context context;
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
this.context = context;
Log.d("app","Network connectivity change==>"+isOnline());
if(isOnline()==true)
{
//Internet Connected!
}
else
{
// No Internet!
}
}
protected boolean isOnline() {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnected()) {
return true;
} else {
return false;
}
}
}
Определите, есть ли у вас подключение к Интернету
ConnectivityManager cm =
(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null &&
activeNetwork.isConnectedOrConnecting();
Определите тип вашего интернет-соединения
Подключение устройства может быть обеспечено мобильными данными, WiMAX, Wi-Fi и сетевыми подключениями. Опросив тип активной сети, как показано ниже, вы можете изменить частоту обновления в зависимости от доступной пропускной способности.
boolean isWiFi = activeNetwork.getType() == ConnectivityManager.TYPE_WIFI;
Мониторинг изменений в подключении
Приложения, ориентированные на Android 7.0 (уровень API 24), не получают трансляции CONNECTIVITY_ACTION, даже если они регистрируют эти трансляции в своем манифесте. Работающие приложения могут по-прежнему прослушивать CONNECTIVITY_CHANGE в своем основном потоке, регистрируя BroadcastReceiver с Context.registerReceiver().
Вы можете использовать это, чтобы проверить доступность интернета или нет:
/**
* Check Internet connection is available or not
*
* @param context current context
* Use {@link #checkInternetConnection(Context context)}
* @return {@link Boolean}
*/
public static boolean checkInternetConnection(Context context) {
ConnectivityManager _connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
boolean _isConnected = false;
NetworkInfo _activeNetwork = _connManager.getActiveNetworkInfo();
if (_activeNetwork != null) {
_isConnected = _activeNetwork.isConnectedOrConnecting();
}
return _isConnected;
}
Используйте Broadcast Receiver:
Заявка на участие
<receiver android:name=".your.namepackage.here.ConnectivityReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
класс для получателя:
public class ConnectivityReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
switch (action) {
case ConnectivityManager.CONNECTIVITY_ACTION:
if(isConnect()) //your logic to check netwrok
{
//do action here
}
break;
}
}
}
Попробуй этот код
public static boolean isActiveNetworkMetered(Context context) {
ConnectivityManager manager = getConnectivityManager(context);
if (manager == null)
return false;
ConnectivityManagerCompat compat = new ConnectivityManagerCompat();
return compat.isActiveNetworkMetered(manager);
}
public static String getActiveNetworkName(Context context) {
try {
NetworkInfo info = getActivieNetworkInfo(context);
String typeName = info.getTypeName().toLowerCase();
if (typeName.equals("wifi")) {
return typeName;
} else {
String extraInfoName = info.getExtraInfo().toLowerCase();
if (!TextUtils.isEmpty(extraInfoName))
return extraInfoName;
}
return typeName;
} catch (Exception e) {
return null;
}
}