我想使用wifi通过本地网络发送数据。在发送数据之前,我检查wifi状态,如果没有启用,请询问用户并打开wifi。 问题是如果我打开wifi并尝试立即使用它,我有一个错误因为wifi需要一些时间来打开。
所以,正如我想的那样,我需要打开wifi并设置当wifi进入启用状态时将被调用的处理程序。但是WifiManager并没有为处理程序提供这样的方法。我如何能够改变wifi状态?
UPD
我如何打开wifi:
WifiManager wifi = WifiUtils.getWifi( getApplicationContext() );
if (WifiUtils.isWifiEnabled( wifi)) return true;
wifi.setWifiEnabled(true);
//---
public static WifiManager getWifi( Context ctx)
{
return (WifiManager)ctx.getSystemService(ctx.WIFI_SERVICE);
}
public static boolean isWifiEnabled( WifiManager wifi)
{
if (wifi==null) return false;
if (wifi.getWifiState()!=wifi.WIFI_STATE_ENABLED) return false;
return true;
}
答案 0 :(得分:2)
首先,如果你想检查wifi是否已连接你可以使用这个
ConnectivityManager cm = (ConnectivityManager) getSystemService(
Context.CONNECTIVITY_SERVICE);
NetworkInfo wifiNetwork = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (wifiNetwork != null && wifiNetwork.isConnected()) {
}
else{
//ask your user to turn on wifi
}
现在,如果您想检查设备是否可以访问互联网,即使启用了wifi,那么您可以执行类似
的操作if (wifiNetwork != null && wifiNetwork.isConnected()) {
HttpURLConnection conn= (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(10000);
int responseCode = conn.getResponseCode();
if(responseCode == 200){
//internet access
}
else {
//no internet access
}
}
如果您想处理wifi状态更改,可以尝试BroadcastReceiver when wifi or 3g network state changed或Android: Getting Notified of Connectivity Changes
但是,如果您想以编程方式启用wifi,请参阅this SO question。基本上您需要做类似的事情
WifiManager wManager = (WifiManager)this.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
wManager.setWifiEnabled(booleanValue); //true for on and false for off
当然,您需要在AndroidManifest.xml
中添加必要的权限,例如
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.UPDATE_DEVICE_STATS"></uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>