Как определить, когда в Android установлено соединение WIFI?

Мне нужно определить, когда у меня есть сетевое подключение через WIFI. Какая передача отправляется, чтобы установить, что было сделано действительное сетевое соединение. Мне нужно проверить, что существует действительное сетевое соединение для HTTP. Что мне следует слушать и какие дополнительные тесты мне нужно знать, чтобы существовало действительное соединение.

Solutions Collecting From Web of "Как определить, когда в Android установлено соединение WIFI?"

Вы можете зарегистрировать BroadcastReceiver для уведомления, когда установлено соединение WiFi (или если соединение изменилось).

Зарегистрируйте BroadcastReceiver :

 IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION); registerReceiver(broadcastReceiver, intentFilter); 

И тогда в вашем BroadcastReceiver сделайте что-то вроде этого:

 @Override public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)) { if (intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED, false)){ //do stuff } else { // wifi connection was lost } } } 

Для получения дополнительной информации см. Документацию для BroadcastReceiver и WifiManager

Конечно, вы должны проверить, подключено ли устройство к WiFi до этого.

EDIT: Благодаря запрету геоинженерии, вот способ проверить, подключено ли устройство:

  private boolean isConnectedViaWifi() { ConnectivityManager connectivityManager = (ConnectivityManager) appObj.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo mWifi = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); return mWifi.isConnected(); } 

Лучшее, что сработало для меня:

AndroidManifest

 <receiver android:name="com.AEDesign.communication.WifiReceiver" > <intent-filter android:priority="100"> <action android:name="android.net.wifi.STATE_CHANGE" /> </intent-filter> </receiver> 

Класс BroadcastReceiver

 public class WifiReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); if(info != null && info.isConnected()) { // Do your work. // eg To check the Network Name or other info: WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE); WifiInfo wifiInfo = wifiManager.getConnectionInfo(); String ssid = wifiInfo.getSSID(); } } } 

права доступа

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

Для меня работает только WifiManager.NETWORK_STATE_CHANGED_ACTION .

Зарегистрировать широковещательный приемник:

 IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); registerReceiver(broadcastReceiver, intentFilter); 

И получать:

 @Override public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); if(action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)){ NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); boolean connected = info.isConnected(); //call your method } } 

Ответ, заданный пользователем @JPM и @usman, действительно очень полезен. Он отлично работает, но в моем случае он входит в onReceive несколько раз в моем случае 4 раза, поэтому мой код выполняется несколько раз.

Я делаю некоторые изменения и делаю согласно моему требованию, и теперь он приходит только 1 раз

Вот класс java для трансляции.

 public class WifiReceiver extends BroadcastReceiver { String TAG = getClass().getSimpleName(); private Context mContext; @Override public void onReceive(Context context, Intent intent) { mContext = context; if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = cm.getActiveNetworkInfo(); if (networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI && networkInfo.isConnected()) { // Wifi is connected WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); WifiInfo wifiInfo = wifiManager.getConnectionInfo(); String ssid = wifiInfo.getSSID(); Log.e(TAG, " -- Wifi connected --- " + " SSID " + ssid ); } } else if (intent.getAction().equalsIgnoreCase(WifiManager.WIFI_STATE_CHANGED_ACTION)) { int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN); if (wifiState == WifiManager.WIFI_STATE_DISABLED) { Log.e(TAG, " ----- Wifi Disconnected ----- "); } } } } 

В AndroidManifest

 <receiver android:name=".util.WifiReceiver" android:enabled="true"> <intent-filter> <action android:name="android.net.wifi.WIFI_STATE_CHANGED" /> <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> </intent-filter> </receiver> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 

Вы можете запустить Wi-Fi-соединение, если вы дадите пользователю возможность отменить обычное поведение, задаваемое каждый раз.

Я выбираю использовать три метода …

 public boolean isOnline() { ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); return (networkInfo != null && networkInfo.isConnected()); } 

Это быстрая проверка, если есть интернет-соединение Wi-Fi или CellData. Отсюда вы можете выбрать, какое действие вы хотите предпринять. Необходимо также проверить режим полета в самолете.

На отдельном потоке. Я устанавливаю переменную IpAddress в = "" и опросу, пока у меня не будет действительного ip-адреса.

  WifiManager wifi; wifi = (WifiManager) this.getSystemService(Context.WIFI_SERVICE); WifiInfo wifiInfo = wifi.getConnectionInfo(); int ipAddress = wifiInfo.getIpAddress(); String ip = null; ip = String.format("%d.%d.%d.%d", (ipAddress & 0xff), (ipAddress >> 8 & 0xff), (ipAddress >> 16 & 0xff), (ipAddress >> 24 & 0xff)); Log.e(" >>IP number Begin ",ip); 

Еще один фрагмент кода … Если его не включить, включите его (с предварительным разрешением пользователей)

  if(wifi.isWifiEnabled()!=true)wifi.setWifiEnabled(true); 

Чтобы определить состояние соединения WIFI, я использовал CONNECTIVITY_ACTION из класса ConnectivityManager, чтобы:

  IntentFilter filter=new IntentFilter(); filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); registerReceiver(receiver, filter); 

И от вашего BroadCastReceiver:

  if (ConnectivityManager.CONNECTIVITY_ACTION.equals(action)) { int networkType = intent.getIntExtra( android.net.ConnectivityManager.EXTRA_NETWORK_TYPE, -1); if (ConnectivityManager.TYPE_WIFI == networkType) { NetworkInfo networkInfo = (NetworkInfo) intent .getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); if (networkInfo != null) { if (networkInfo.isConnected()) { // TODO: wifi is connected } else { // TODO: wifi is not connected } } } } 

Ps: отлично работает для меня 🙂

Этот код не требует разрешения вообще. Он ограничен только изменениями состояния подключения к сети Wi-Fi (любая другая сеть не учитывается). Получатель статически публикуется в файле AndroidManifest.xml и не нужно экспортировать, так как он будет вызываться protected broadcast системой NETWORK_STATE_CHANGED_ACTION при каждом изменении состояния сетевого подключения.

AndroidManifest:

 <receiver android:name=".WifiReceiver" android:enabled="true" android:exported="false"> <intent-filter> <!--protected-broadcast: Special broadcast that only the system can send--> <!--Corresponds to: android.net.wifi.WifiManager.NETWORK_STATE_CHANGED_ACTION--> <action android:name="android.net.wifi.STATE_CHANGE" /> </intent-filter> </receiver> 

Класс BroadcastReceiver:

 public class WifiReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { /* Tested (I didn't test with the WPS "Wi-Fi Protected Setup" standard): In API15 (ICE_CREAM_SANDWICH) this method is called when the new Wi-Fi network state is: DISCONNECTED, OBTAINING_IPADDR, CONNECTED or SCANNING In API19 (KITKAT) this method is called when the new Wi-Fi network state is: DISCONNECTED (twice), OBTAINING_IPADDR, VERIFYING_POOR_LINK, CAPTIVE_PORTAL_CHECK or CONNECTED (Those states can be obtained as NetworkInfo.DetailedState objects by calling the NetworkInfo object method: "networkInfo.getDetailedState()") */ /* * NetworkInfo object associated with the Wi-Fi network. * It won't be null when "android.net.wifi.STATE_CHANGE" action intent arrives. */ NetworkInfo networkInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); if (networkInfo != null && networkInfo.isConnected()) { // TODO: Place the work here, like retrieving the access point's SSID /* * WifiInfo object giving information about the access point we are connected to. * It shouldn't be null when the new Wi-Fi network state is CONNECTED, but it got * null sometimes when connecting to a "virtualized Wi-Fi router" in API15. */ WifiInfo wifiInfo = intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO); String ssid = wifiInfo.getSSID(); } } } 

Разрешения:

 None 

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

Я IntentService этот код из IntentService прежде чем пытаюсь загрузить материал.

Обратите внимание, что NetworkInfo будет null если нет никакого сетевого подключения.

 private boolean canConnect() { ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); boolean canConnect = false; boolean wifiOnly = SharedPreferencesUtils.wifiOnly(); NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); if(networkInfo != null) { if(networkInfo.isConnected()) { if((networkInfo.getType() == ConnectivityManager.TYPE_WIFI) || (networkInfo.getType() != ConnectivityManager.TYPE_WIFI && !wifiOnly)) { canConnect = true; } } } return canConnect; } 

Я использовал этот код:

 public class MainActivity extends Activity { . . . @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); . . . } @Override protected void onResume() { super.onResume(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION); registerReceiver(broadcastReceiver, intentFilter); } @Override protected void onPause() { super.onPause(); unregisterReceiver(broadcastReceiver); } private final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)) { if (intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED, false)) { // wifi is enabled } else { // wifi is disabled } } } }; } 

У меня есть два метода для обнаружения WIFI-соединения, получающего контекст приложения:

1) мой старый метод

 public boolean isConnectedWifi1(Context context) { try { ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); if (networkInfo != null) { NetworkInfo[] netInfo = connectivityManager.getAllNetworkInfo(); for (NetworkInfo ni : netInfo) { if ((ni.getTypeName().equalsIgnoreCase("WIFI")) && ni.isConnected()) { return true; } } } return false; } catch (Exception e) { Log.e(TAG, e.getMessage()); } return false; } 

2) мой новый метод (в настоящее время я использую этот метод):

 public boolean isConnectedWifi(Context context) { ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); return networkInfo.isConnected(); } 

Для всех тех, кто пользуется поддержкой CONNECTIVITY_CHANGE , обратите внимание, что это больше не срабатывает, когда приложение находится в фоновом режиме в Android O.

https://developer.android.com/about/versions/o/background.html