Android - 如何以编程方式打开wifi并等到它未启用

时间:2014-09-04 21:09:45

标签: android wifi android-wifi wifimanager wificonfiguration

我想使用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;
}

1 个答案:

答案 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 changedAndroid: 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>