如何查看Android上是否连接了Wi-Fi?

时间:2010-10-01 16:51:11

标签: android android-wifi wifimanager

我不希望我的用户甚至尝试下载某些东西,除非他们已经连接了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作为状态。

24 个答案:

答案 0 :(得分:451)

您应该能够使用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 ,以便工作。

NOTE2 public NetworkInfo getNetworkInfo (int networkType)现已弃用:

  

此方法在API级别23中已弃用。此方法不允许   支持相同类型的多个连接网络。使用   改为使用getAllNetworks()和getNetworkInfo(android.net.Network)。

NOTE3 public static final int TYPE_WIFI现已弃用:

  

此常量在API级别28中已弃用。   应用程序应使用NetworkCapabilities.hasTransport(int)或requestNetwork(NetworkRequest,NetworkCallback)来请求适当的网络。支持运输。

答案 1 :(得分:60)

由于 API-23 中的 NetworkInfo.isConnected()方法现已已弃用,因此以下是检测Wi-的方法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
    }
}

答案 2 :(得分:34)

我只使用以下内容:

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

在调用getSupplicantState();

时,将返回其中一个状态
  

相关 - 协会已完成。

     

关联 - 尝试与之关联   接入点。

     

已完成 - 所有身份验证   完成。

     

DISCONNECTED - 此状态表示   该客户端没有关联,但是   可能会开始寻找访问权限   点。

     

DORMANT - 一个Android添加状态   在客户发布时报告   显式DISCONNECT命令。

     

FOUR_WAY_HANDSHAKE - WPA四向键   握手正在进行中。

     

GROUP_HANDSHAKE - WPA组密钥   握手正在进行中。

     

非活动 - 非活动状态。

     

INVALID - 应该的伪状态   通常永远不会被看到。

     

扫描 - 扫描网络。

     

UNINITIALIZED - 没有联系。

答案 3 :(得分:18)

我在我的应用中使用此功能来检查活动网络是否为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

}

答案 4 :(得分: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
}

我使用if for license check in Root Toolbox PRO,它看起来效果很好。

答案 5 :(得分:6)

虽然Jason's answer是正确的,但现在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;
}

答案 6 :(得分: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;
}

答案 7 :(得分:3)

使用WifiManager即可:

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

方法getNeworkId仅在未连接到网络时返回-1;

答案 8 :(得分: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;
}

此方法有助于查找是否可用的互联网连接。

答案 9 :(得分: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" />

答案 10 :(得分:2)

许多答案都使用了不赞成使用的代码,或者在higer 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;

答案 11 :(得分:2)

以下代码(在Kotlin中)从API 21开始运行,直到至少是当前的API版本(API 29)。 函数getWifiState()返回WiFi网络状态的3个可能值之一: 枚举类中定义的“禁用”,“ EnabledNotConnected”和“已连接”。 这样可以做出更精细的决定,例如通知用户启用WiFi或(如果已启用)连接到可用网络之一。 但是,如果只需要一个布尔值即可指示WiFi接口是否已连接到网络,则另一个函数isWifiConnected()会为您提供。它使用上一个,并将结果与​​“已连接”进行比较。

它的灵感来自先前的一些答案,但它试图解决由于Android API的演进或IP V6可用性的缓慢增长而引入的问题。 诀窍是使用:

wifiManager.connectionInfo.bssid != null 

代替:

  1. getIpAddress()== 0,仅对IP V4或
  2. 有效
  3. getNetworkId()== -1,现在需要另一个特殊权限(位置)

根据文档:https://developer.android.com/reference/kotlin/android/net/wifi/WifiInfo.html#getbssid 如果未连接到网络,它将返回null。即使我们没有获得真实值的权限,但如果我们已连接,它将仍然返回null以外的值。

还要注意以下几点:

  

在此对象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)
    }
}

答案 12 :(得分: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();
}

答案 13 :(得分: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
            }
        }

    }
}

并添加预设

答案 14 :(得分:1)

类似于@Jason Knight的回答,但以科特林的方式:

List = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]

答案 15 :(得分:0)

这适用于最新版本的安卓:

SELECT CAST('test' AS varchar(10)) FROM < external table to database C >

在清单中:

fun getConnectionType(context: Context): ConnectivityType {
    var result = NONE
    val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager?
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (cm != null) {
            val capabilities = cm.getNetworkCapabilities(cm.activeNetwork)
            if (capabilities != null) {
                when {
                    capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> {
                        result = WIFI
                    }
                    capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> {
                        result = MOBILE_DATA
                    }
                    capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN) -> {
                        result = VPN
                    }
                }
            }
        }
    } else {
        if (cm != null) {
            val activeNetwork = cm.activeNetworkInfo
            if (activeNetwork != null) {
                // connected to the internet
                when (activeNetwork.type) {
                    ConnectivityManager.TYPE_WIFI -> {
                        result = WIFI
                    }
                    ConnectivityManager.TYPE_MOBILE -> {
                        result = MOBILE_DATA
                    }
                    ConnectivityManager.TYPE_VPN -> {
                        result = VPN
                    }
                }
            }
        }
    }
    return result
}

enum class ConnectivityType {
    NONE,
    MOBILE_DATA,
    WIFI,
    VPN,
}

答案 16 :(得分:0)

总结较新的android版本中的其他答案:

private boolean checkWifiOnAndConnected()
{
    ConnectivityManager connMgr =
            (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    Network network = connMgr.getActiveNetwork();
    if (network != null)
    {
        NetworkCapabilities networkCapabilities = connMgr.getNetworkCapabilities(network);
        return networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI);
    }
    return false;
}

答案 17 :(得分:0)

val wifi = context!!.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager?        
         if (wifi!!.isWifiEnabled) 
              //do action here
    
         else 
             //do action here
    
        
                    

答案 18 :(得分:0)

有点老问题了,但这就是我用的。要求最低api级别21还考虑了不建议使用的Networkinfo api。

boolean isWifiConn = false;
    ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        Network network = connMgr.getActiveNetwork();
        if (network == null) return false;
        NetworkCapabilities capabilities = connMgr.getNetworkCapabilities(network);
        if(capabilities != null && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)){
            isWifiConn = true;
            Toast.makeText(context,"Wifi connected Api >= "+Build.VERSION_CODES.M,Toast.LENGTH_LONG).show();
        }else{
            Toast.makeText(context,"Wifi not connected Api >= "+Build.VERSION_CODES.M,Toast.LENGTH_LONG).show();
        }
    } else {
        for (Network network : connMgr.getAllNetworks()) {
            NetworkInfo networkInfo = connMgr.getNetworkInfo(network);
            if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI && networkInfo.isConnected()) {
                isWifiConn = true;
                Toast.makeText(context,"Wifi connected ",Toast.LENGTH_LONG).show();
                break;
            }else{
                Toast.makeText(context,"Wifi not connected ",Toast.LENGTH_LONG).show();
            }
        }
    }
    return isWifiConn;

答案 19 :(得分:0)

为此添加JAVA:

public boolean CheckWifiConnection() {
        ConnectivityManager conMgr = (ConnectivityManager) getSystemService (Context.CONNECTIVITY_SERVICE);
        if (conMgr.getActiveNetworkInfo() != null
                && conMgr.getActiveNetworkInfo().isAvailable()
                && conMgr.getActiveNetworkInfo().isConnected()) {
            return true;
        } else {
            return false;
        }
    }

在清单文件中添加以下权限:

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

答案 20 :(得分:0)

NetworkInfoConnectivityManager#getNetworkInfo()开始,从API级别29开始不推荐使用ConnectivityManager#getActiveNetworkInfo()类。

documentation现在建议人们使用ConnectivityManager.NetworkCallback API进行异步回调监视,或者使用ConnectivityManager#getNetworkCapabilitiesConnectivityManager#getLinkProperties来同步访问网络信息

  

呼叫者应改用ConnectivityManager.NetworkCallback API来了解连接性更改,或切换为使用ConnectivityManager#getNetworkCapabilities或ConnectivityManager#getLinkProperties同步获取信息。


要检查WiFi是否已连接,这是我使用的代码:

科特琳:

val connMgr = applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager?
connMgr?: return false
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    val network: Network = connMgr.activeNetwork ?: return false
    val capabilities = connMgr.getNetworkCapabilities(network)
    return capabilities != null && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
} else {
    val networkInfo = connMgr.activeNetworkInfo ?: return false
    return networkInfo.isConnected && networkInfo.type == ConnectivityManager.TYPE_WIFI
}

Java:

ConnectivityManager connMgr = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
if (connMgr == null) {
    return false;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    Network network = connMgr.getActiveNetwork();
    if (network == null) return false;
    NetworkCapabilities capabilities = connMgr.getNetworkCapabilities(network);
    return capabilities != null && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI);
} else {
    NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
    return networkInfo.isConnected() && networkInfo.getType() == ConnectivityManager.TYPE_WIFI;
}

请记住还要向清单文件中添加权限ACCESS_NETWORK_STATE

答案 21 :(得分:0)

如果未启用WIFI,则可以打开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();
}

}

答案 22 :(得分:0)

尝试

wifiManager.getConnectionInfo().getIpAddress()

这将返回0,直到设备具有可用连接(在我的机器上,Samsung SM-T280,Android 5.1.1)。

答案 23 :(得分: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>