Как узнать, подключен ли Wi-Fi на Android?
Я не хочу, чтобы мой пользователь даже пытался загрузить что-то, если у них нет Wi-Fi. Тем не менее, я могу только сказать, что могу сказать, включен ли Wi-Fi, но у них все еще может быть 3G-соединение.
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
как состояние.
Ответы
Ответ 1
Вы должны иметь возможность использовать ConnectivityManager для получения состояния адаптера Wi-Fi. Оттуда вы можете проверить, подключен ли он или даже доступен.
ConnectivityManager connManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (mWifi.isConnected()) {
// Do whatever
}
ПРИМЕЧАНИЕ: следует отметить (для нас здесь), что вам нужно добавить
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
на ваш
AndroidManifest.xml для этого, чтобы работать.
ПРИМЕЧАНИЕ 2: public NetworkInfo getNetworkInfo (int networkType)
теперь устарела:
Этот метод устарел на уровне API 23. Этот метод не поддерживает несколько подключенных сетей одного типа. Вместо этого используйте getAllNetworks() и getNetworkInfo (android.net.Network).
ПРИМЕЧАНИЕ 3: public static final int TYPE_WIFI
теперь устарела:
Эта константа устарела на уровне API 28. Приложения должны вместо этого использовать NetworkCapabilities.hasTransport(int) или requestNetwork (NetworkRequest, NetworkCallback) для запроса соответствующей сети. для поддерживаемых перевозок.
Ответ 2
Так как метод 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
}
}
Ответ 3
Я просто использую следующее:
SupplicantState supState;
wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
supState = wifiInfo.getSupplicantState();
который вернет одно из этих состояний во время вызова getSupplicantState();
ASSOCIATED - Ассоциация завершена.
АССОЦИАЦИЯ - Попытка связать точка доступа.
COMPLETED - вся аутентификация завершено.
ОТКЛЮЧЕНО - это состояние указывает этот клиент не связан, но вероятно, начнет искать доступ точка.
DORMANT - состояние, добавленное Android, которое сообщается, когда клиент выдает явная команда DISCONNECT.
FOUR_WAY_HANDSHAKE - WPA 4-Way Key Рукопожатие в процессе.
GROUP_HANDSHAKE - ключ группы WPA Рукопожатие в процессе.
НЕАКТИВНО - Неактивное состояние.
INVALID - псевдо-состояние, которое должно обычно не видны.
СКАНИРОВАНИЕ - Сканирование сети.
UNINITIALIZED - нет связи.
Ответ 4
Я использую это в своих приложениях, чтобы проверить, является ли активная сеть 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
}
Ответ 5
Я рассмотрел несколько таких вопросов и придумал следующее:
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, и, похоже, он отлично работает.
Ответ 6
В то время как ответ Джейсона верен, в настоящее время getNetWorkInfo (int) является устаревшим методом. Таким образом, следующая функция будет хорошей альтернативой:
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;
}
Ответ 7
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;
}
Ответ 8
Используя WifiManager
, вы можете:
WifiManager wifi = (WifiManager) getSystemService (Context.WIFI_SERVICE);
if (wifi.getConnectionInfo().getNetworkId() != -1) {/* connected */}
Метод getNeworkId возвращает -1 только тогда, когда он не подключен к сети;
Ответ 9
Попробуйте этот метод.
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;
}
Этот метод поможет найти доступное интернет-соединение или нет.
Ответ 10
Это работает для меня:
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" />
Ответ 11
Вот что я использую в своих приложениях как служебный метод:
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();
}
Ответ 12
В новой версии 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 too
Ответ 13
Аналогично ответу @Jason Knight, но по-котлински:
val connManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI)
if (mWifi.isConnected) {
// Do whatever
}
Ответ 14
Это более легкое решение. См. "Переполнение стека"
вопрос Проверка Wi-Fi включен или нет на 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>
Ответ 15
Try
wifiManager.getConnectionInfo().getIpAddress()
Это возвращает 0, пока у устройства не будет удобного подключения (на моей машине, Samsung SM-T280, Android 5.1.1).
Ответ 16
Вы можете включить 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();
}
}
Ответ 17
Во многих ответах используется устаревший код или код, доступный в более высоких версиях API. Теперь я использую что-то вроде этого
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if(connectivityManager != null) {
for (Network net : connectivityManager.getAllNetworks()) {
NetworkCapabilities nc = connectivityManager.getNetworkCapabilities(net);
if (nc != null && nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
&& nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET))
return true;
}
}
return false;
Ответ 18
Следующий код (в Kotlin) работает от API 21 до как минимум текущей версии API (API 29).
Функция getWifiState() возвращает одно из 3 возможных значений состояния сети WiFi:
Disable, EnabledNotConnected и Connected, которые были определены в классе enum.
Это позволяет принимать более детальные решения, такие как информирование пользователя о включении Wi-Fi или, если оно уже включено, подключения к одной из доступных сетей.
Но если все, что нужно, это логическое значение, указывающее, подключен ли интерфейс WiFi к сети, тогда другая функция - Wi-FiConnected() даст вам это. Он использует предыдущий и сравнивает результат с подключенным.
Он вдохновлял на некоторые из предыдущих ответов, но пытался решить проблемы, связанные с развитием Android API или медленно растущей доступностью IP V6.
Хитрость заключалась в том, чтобы использовать:
wifiManager.connectionInfo.bssid != null
вместо:
- getIpAddress() == 0, который действителен только для IP V4 или
- getNetworkId() == -1, для которого теперь требуется другое специальное разрешение (Местоположение)
Согласно документации: https://developer.android.com/reference/kotlin/android/net/wifi/WifiInfo.html#getbssid
он вернет ноль, если не подключен к сети. И даже если у нас нет разрешения на получение реального значения, оно все равно будет возвращать что-то отличное от нуля, если мы подключены.
Также имейте в виду следующее:
В выпусках до android.os.Build.VERSION_CODES # N этот объект должен быть получен только из Context # getApplicationContext(), и не из какого-либо другого производного контекста, чтобы избежать утечек памяти внутри вызывающий процесс.
В Манифесте не забудьте добавить:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
Предлагаемый код:
class MyViewModel(application: Application) : AndroidViewModel(application) {
// Get application context
private val myAppContext: Context = getApplication<Application>().applicationContext
// Define the different possible states for the WiFi Connection
internal enum class WifiState {
Disabled, // WiFi is not enabled
EnabledNotConnected, // WiFi is enabled but we are not connected to any WiFi network
Connected, // Connected to a WiFi network
}
// Get the current state of the WiFi network
private fun getWifiState() : WifiState {
val wifiManager : WifiManager = myAppContext.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
return if (wifiManager.isWifiEnabled) {
if (wifiManager.connectionInfo.bssid != null)
WifiState.Connected
else
WifiState.EnabledNotConnected
} else {
WifiState.Disabled
}
}
// Returns true if we are connected to a WiFi network
private fun isWiFiConnected() : Boolean {
return (getWifiState() == WifiState.Connected)
}
}