我不希望我的用户尝试下载任何东西,除非他们连接了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作为状态。
您应该能够使用ConnectivityManager来获取Wi-Fi适配器的状态。从那里你可以检查它是否连接,甚至可用。
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:公共NetworkInfo getNetworkInfo (int networkType)现在已弃用:
此方法在API级别23中已弃用。这个方法没有
支持多个相同类型的网络连接。使用
getAllNetworks()和getNetworkInfo(android.net.Network)代替。
注3:public static final int TYPE_WIFI现在已弃用:
此常量在API级别28中已弃用。
应用程序应该使用networkcapabilities . hatransporsport (int)或requestNetwork(NetworkRequest, NetworkCallback)来请求一个合适的网络。对于支持的传输。
我简单地使用以下方法:
SupplicantState supState;
wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
supState = wifiInfo.getSupplicantState();
它将在调用getSupplicantState()时返回这些状态之一;
ASSOCIATED - Association completed.
ASSOCIATING - Trying to associate with
an access point.
COMPLETED - All authentication
completed.
DISCONNECTED - This state indicates
that client is not associated, but is
likely to start looking for an access
point.
DORMANT - An Android-added state that
is reported when a client issues an
explicit DISCONNECT command.
FOUR_WAY_HANDSHAKE - WPA 4-Way Key
Handshake in progress.
GROUP_HANDSHAKE - WPA Group Key
Handshake in progress.
INACTIVE - Inactive state.
INVALID - A pseudo-state that should
normally never be seen.
SCANNING - Scanning for a network.
UNINITIALIZED - No connection.
这个问题有点老了,但我用的就是这个。要求最低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;