2010-10-01 2 views
206

Я не хочу, чтобы мой пользователь даже пытался загрузить что-то, если у них нет Wi-Fi. Тем не менее, я могу только сказать, что могу сказать, включен ли Wi-Fi, но у них все еще может быть 3G-соединение.Как узнать, подключен ли Wi-Fi на Android?

android.net.wifi.WifiManager m = (WifiManager) getSystemService(WIFI_SERVICE); 
android.net.wifi.SupplicantState s = m.getConnectionInfo().getSupplicantState(); 
NetworkInfo.DetailedState state = WifiInfo.getDetailedStateOf(s); 
if (state != NetworkInfo.DetailedState.CONNECTED) { 
    return false; 
} 

Однако государство не то, что я ожидаю. Хотя Wi-Fi подключен, я получаю OBTAINING_IPADDR как состояние.

ответ

424

Вы должны иметь возможность использовать ConnectivityManager для получения состояния адаптера Wi-Fi. Оттуда вы можете check if it is connected or even available.

ConnectivityManager connManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 

if (mWifi.isConnected()) { 
    // Do whatever 
} 

ПРИМЕЧАНИЕ: Следует отметить (для нас n00bies здесь), что вам нужно добавить

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

к вашему

AndroidManifest.xml для этой работы.

Примечание 2: public NetworkInfo getNetworkInfo (int networkType) теперь не рекомендуется:

Этот метод был устаревшим в уровне API 23. Этот метод не поддержка нескольких соединенных сети одного и того же типа. Вместо этого используйте getAllNetworks() и getNetworkInfo (android.net.Network).

+69

Следует отметить (для нас нубов здесь), что вам нужно добавить 'android.permission.ACCESS_NETWORK_STATE' к вашему AndroidManifest.xml для этой работы. – mgalgs

+1

дает мне ошибку в 'CONNECTIVITY_SERVICE' –

+0

John x, чтобы заставить его работать, используйте« Context.CONNECTIVITY_SERVICE ». –

30

Я просто использую следующее:

SupplicantState supState; 
wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
WifiInfo wifiInfo = wifiManager.getConnectionInfo(); 
supState = wifiInfo.getSupplicantState(); 

Который будет возвращать одно из этих состояний в то время вы звоните getSupplicantState();

ASSOCIATED - Ассоциация завершена.

ASSOCIATING - Попытка связать с точкой доступа.

ЗАПОЛНИТЬ - Вся аутентификация завершена.

ОТСОЕДИНЕННОМ - Это состояние указывает на то, что клиент не связан, но вероятно, начать искать доступа точки.

DORMANT - Состояние Android, которое сообщается, когда клиент выдает команду DISCONNECT .

FOUR_WAY_HANDSHAKE - WPA 4-Way Key Рукопожатие в процессе.

GROUP_HANDSHAKE - Группа ключей WPA Рукопожатие в процессе.

НЕАКТИВНО - Неактивное состояние.

INVALID - Псевдо-состояние, которое должно обычно не видно.

СКАНИРОВАНИЕ - Сканирование сети.

UNINITIALIZED - Без связи.

+0

привет Donal.I использовал тот же способ, чтобы узнать, подключено ли наше устройство к Wi-Fi. Но дополнительно мне нужно знать имя приложения, использующего в настоящее время WIFI. Как это сделать? – AbhishekB

+0

@AbhishekB, извините, но у меня нет опыта с этим, возможно, попробуйте взглянуть на некоторые приложения для мониторинга Wi-Fi, посмотрите, есть ли открытый исходный код, где вы можете просмотреть код. –

+0

Я подозрительно отношусь к этому решению, потому что проситель используется только в том случае, если WPA (или какой-либо вариант WPA) используется used: если пользователь подключается к AP без аутентификации или WEP, то проситель не участвует. – Tom

17

Я посмотрел на несколько вопросов, как это и придумал это:

ConnectivityManager connManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); 
NetworkInfo wifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 
NetworkInfo mobile = connManager .getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 

if (wifi.isConnected()){ 
    // If Wi-Fi connected 
} 

if (mobile.isConnected()) { 
    // If Internet connected 
} 

использовать, если для моей проверки лицензии в Root Toolbox PRO, и это, кажется, отлично работает.

+8

выглядит хорошо, но я не уверен, почему вы получаете вторую ссылку на ConnectivityManager. В этом примере connManager и connManager1 являются одинаковыми Объект – schwiz

+1

Имеет ли TYPE_MOBLIE 3gnet или gprs net? – herbertD

+1

TYPE_MOBILE означает любые данные с использованием вашего оператора - 2G (GPRS ...), 3G (HSDPA ...) или 4G (LTE ...). –

15

Я использую это в моих приложений, чтобы проверить, если активная сеть Wi-Fi:

ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
NetworkInfo ni = cm.getActiveNetworkInfo(); 
if (ni != null && ni.getType() == ConnectivityManager.TYPE_WIFI) 
{ 

    // Do your work here 

} 
+0

Это лучший ответ, потому что он гарантирует, что «активная» сеть (та, которая будет использоваться для загрузки) - это WiFi – Gavriel

+1

. Это также лучший ответ теперь, когда 'NetworkInfo # isConnected' устарел –

+0

Определенно лучший ответ для в этом году (2017 год). –

3
ConnectivityManager manager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); 
boolean is3g = manager.getNetworkInfo(
        ConnectivityManager.TYPE_MOBILE).isConnectedOrConnecting(); 
boolean isWifi = manager.getNetworkInfo(
        ConnectivityManager.TYPE_WIFI).isConnectedOrConnecting(); 

Log.v("", is3g + " ConnectivityManager Test " + isWifi); 
if (!is3g && !isWifi) { 
    Toast.makeText(
     getApplicationContext(), 
     "Please make sure, your network connection is ON ", 
     Toast.LENGTH_LONG).show(); 
} 
else { 
    // Put your function() to go further; 
} 
+1

, было бы лучше добавить некоторое объяснение, а не просто код. – EdChum

+2

Я бы использовал *** isConnected() ***, документы говорят: 'boolean isConnectedOrConnecting()' Указывает, существует ли сетевая связь или находится в процессе ее создания. Это хорошо для приложений, которые должны делать что-либо, связанное с сетью, отличное от чтения или записи данных. Для последнего вместо этого вызовите 'isConnected()', что гарантирует полную работоспособность сети. – 18446744073709551615

2

Попробуйте этот метод.

public boolean isInternetConnected() { 
    ConnectivityManager conMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    boolean ret = true; 
    if (conMgr != null) { 
     NetworkInfo i = conMgr.getActiveNetworkInfo(); 

     if (i != null) { 
      if (!i.isConnected()) { 
       ret = false; 
      } 

      if (!i.isAvailable()) { 
       ret = false; 
      } 
     } 

     if (i == null) 
      ret = false; 
    } else 
     ret = false; 
    return ret; 
} 

Этот метод поможет найти доступное интернет-соединение или нет.

+1

Я смотрел конкретно, если активное соединение wifi. Кроме того, нет необходимости выполнять нулевую проверку на conMgr, она никогда не будет равна нулю. – schwiz

+0

Вы можете проверить [этот вопрос] (http://stackoverflow.com/questions/31689513/broadcastreceiver-to-detect-network-is-connected), пожалуйста? :( –

2

Это работает для меня:

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

    // Mobile 
    State mobile = conMan.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState(); 

    // Wi-Fi 
    State wifi = conMan.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState(); 

    // And then use it like this: 

    if (mobile == NetworkInfo.State.CONNECTED || mobile == NetworkInfo.State.CONNECTING) 
    { 
     Toast.makeText(Wifi_Gprs.this,"Mobile is Enabled :) ....",Toast.LENGTH_LONG).show(); 
    } 
    else if (wifi == NetworkInfo.State.CONNECTED || wifi == NetworkInfo.State.CONNECTING) 
    { 
     Toast.makeText(Wifi_Gprs.this,"Wifi is Enabled :) ....",Toast.LENGTH_LONG).show(); 
    } 
    else 
    { 
     Toast.makeText(Wifi_Gprs.this,"No Wifi or Gprs Enabled :(....",Toast.LENGTH_LONG).show(); 
    } 

И добавить это разрешение:

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

Использование WifiManager вы можете сделать:

WifiManager wifi = (WifiManager) getSystemService (Context.WIFI_SERVICE); 
if (wifi.getConnectionInfo().getNetworkId() != -1) {/* connected */} 

Метод getNeworkId возвращает -1 только тогда, когда это не подключен к сети;

+0

WIFI_STATE_DISABLED Константа Значение: 1 (0x00000001) WIFI_STATE_DISABLING Константа Значение: 0 (0x00000000) WIFI_STATE_ENABLED Константа Значение: 3 (0x00000003) WIFI_STATE_ENABLING Константа Значение: 2 (0x00000002) WIFI_STATE_UNKNOWN Константа Значение : 4 (0x00000004) –

+0

https://developer.android.com/reference/android/net/wifi/WifiManager.html –

1

Вот что я использую в качестве метода полезности в моих программах:

public static boolean isDeviceOnWifi(final Context context) { 
     ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 
     return mWifi != null && mWifi.isConnectedOrConnecting(); 
} 
+0

Хорошо отметить, что метод isConnectedOrConnecting важен, когда вы проверяете установление соединения. Метод IsConnected не работает для меня. – vincent

0

Это простое решение. См. Переполнение стека вопрос Checking Wi-Fi enabled or not on Android.

P.S. Не забудьте добавить код в файл manifest.xml, чтобы разрешить его. Как показано ниже.

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

Хотя Jason's answer правильно, в настоящее время getNetWorkInfo (НИТ) является устаревшим методом. Таким образом, следующая функция будет хорошая альтернатива:

public static boolean isWifiAvailable (Context context) 
{ 
    boolean br = false; 
    ConnectivityManager cm = null; 
    NetworkInfo ni = null; 

    cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    ni = cm.getActiveNetworkInfo(); 
    br = ((null != ni) && (ni.isConnected()) && (ni.getType() == ConnectivityManager.TYPE_WIFI)); 

    return br; 
} 
42

Поскольку метод NetworkInfo.isConnected() теперь осуждается в API-23, вот метод, который определяет, плетеную Fi адаптер включен, а также подключен к точке доступа с использованием WifiManager вместо:

private boolean checkWifiOnAndConnected() { 
    WifiManager wifiMgr = (WifiManager) getSystemService(Context.WIFI_SERVICE); 

    if (wifiMgr.isWifiEnabled()) { // Wi-Fi adapter is ON 

     WifiInfo wifiInfo = wifiMgr.getConnectionInfo(); 

     if(wifiInfo.getNetworkId() == -1){ 
      return false; // Not connected to an access point 
     } 
     return true; // Connected to an access point 
    } 
    else { 
     return false; // Wi-Fi adapter is OFF 
    } 
} 
+4

Стоит отметить, что wifiInfo может быть нулевым, поэтому я думаю, что вы должны проверить значение null до получения идентификатора сети – Nonos

+1

['NetworkInfo.isConnected()'] (https://developer.android.com/reference/android/net/NetworkInfo. html # isConnected()) не выглядит устаревшим для меня. – EricRobertBrewer

+0

@EricRobertBrewer 'getNetworkInfo (int)' хотя – CJxD

0

Попробуйте

wifiManager.getConnectionInfo().getIpAddress() 

Это возвращает 0 до тех пор, пока устройство не сможет подключиться (на моей машине, Samsung SM-T280, Android 5.1.1).

0

Вы можете включить WIFI, если он не активирован в следующей 1. Проверьте состояние WIFI, как ответил @Jason Knight 2. если не активирован, активировать его не забудьте добавить разрешение WIFI в файле манифеста

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

Ваш класс Java должен быть таким

public class TestApp extends Activity { 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    //check WIFI activation 
    ConnectivityManager connManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 

    if (mWifi.isConnected() == false) { 
     showWIFIDisabledAlertToUser(); 
    } 
    else { 
     Toast.makeText(this, "WIFI is Enabled in your devide", Toast.LENGTH_SHORT).show(); 
    } 
} 


private void showWIFIDisabledAlertToUser(){ 
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this); 
    alertDialogBuilder.setMessage("WIFI is disabled in your device. Would you like to enable it?") 
      .setCancelable(false) 
      .setPositiveButton("Goto Settings Page To Enable WIFI", 
        new DialogInterface.OnClickListener(){ 
         public void onClick(DialogInterface dialog, int id){ 
          Intent callGPSSettingIntent = new Intent(
            Settings.ACTION_WIFI_SETTINGS); 
          startActivity(callGPSSettingIntent); 
         } 
        }); 
    alertDialogBuilder.setNegativeButton("Cancel", 
      new DialogInterface.OnClickListener(){ 
       public void onClick(DialogInterface dialog, int id){ 
        dialog.cancel(); 
       } 
      }); 
    AlertDialog alert = alertDialogBuilder.create(); 
    alert.show(); 
} 

}

1

В новой версии Android

private void getWifiInfo(Context context) { 
    ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    Network[] networks = connManager.getAllNetworks(); 

    if(networks == null || networks.length == 0) 
     return; 

    for(int i = 0; i < networks.length; i++) { 
     Network ntk = networks[i]; 
     NetworkInfo ntkInfo = connManager.getNetworkInfo(ntk); 
     if (ntkInfo.getType() == ConnectivityManager.TYPE_WIFI && ntkInfo.isConnected()) { 
      final WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 
      final WifiInfo connectionInfo = wifiManager.getConnectionInfo(); 
      if (connectionInfo != null) { 
       // add some code here 
      } 
     } 

    } 
} 

и добавить premission слишком

Смежные вопросы