安卓版本:4.4.2 运行平台:广州微嵌安卓工业平板

1、安卓使用wifi模块需在AndroidMainfest.xml声明权限:
允许程序改变Wi-Fi连接状态
    <uses-permission    android:name="android.permission.CHANGE_WIFI_STATE"/>
允许程序访问Wi-Fi网络状态信息
    <uses-permission    android:name="android.permission.ACCESS_WIFI_STATE"/>
2、获取WifiManager的实例,用于操作wifi:
wifiManager = (WifiManager)getSystemService(Service.WIFI_SERVICE);
3、打开或关闭wifi
//isChecked为true表示打开wifi,false关闭WiFi
if(!wifiManager.wifiEnable(isChecked))
{
    Toast.makeText(MainActivity.this,"WifisetEnabledfaled",
        Toast.LENGTH_SHORT).show();;
}
//获取WiFi当前的状态
switch(wifiManager.getWifiState())
{
    //wifi处于关闭状态
    case WifiManager.WIFI_STATE_DISABLED:
        enableSwitch.setChecked(false);
        break;
    //wifi处于打开状态
    case WifiManager.WIFI_STATE_ENABLED:
        enableSwitch.setChecked(true);
        //该方法用于开始扫描附近的wifi热点
        wifiManager.startScan();
        break;
}
4、注册wifi的相应广播监听wifi的状态改变:
//扫描到可用的wifi热点
WifiManager.SCAN_RESULTS_AVAILABLE_ACTION
//wifi状态改变
WifiManager.WIFI_STATE_CHANGED_ACTION
//wifi请求连接成功或失败
WifiManager.SUPPLICANT_STATE_CHANGED_ACTION
//wifi连接或断开状态改变,
ConnectivityManager.CONNECTIVITY_ACTION
//wifi热点状态改变
"android.net.wifi.WIFI_AP_STATE_CHANGED"
定义BroadcastReceiver接收广播:
class WifiReceiver extends BroadcastReceiver
    {
        public void onReceive(Context context, Intent intent)
        {
            //扫描到可用热点
            if (intent.getAction().equals(
                    WifiManager.SCAN_RESULTS_AVAILABLE_ACTION))
            {
                //获取最近一次扫描到的wifi列表                      
                resultList = wifiManager.getScanResults();
                String[] result =  mywifi.getString(resultList);
                int i=0;
                for(ScanResult scan:resultList){
                    //判断是否已保存了连接信息
                    if(mywifi.isSaveConfigtion(scan.SSID)!=null){
                        result[i] += ":已保存";
                    }
                    i++;
                }
            }
            //wifi或热点的状态发生改变
            else if(intent.getAction()
                .equals(WifiManager.WIFI_STATE_CHANGED_ACTION)||
                intent.getAction()
                .equals("android.net.wifi.WIFI_AP_STATE_CHANGED"))
            {
                //获取wifi或热点当前的状态
                switch(intent.getIntExtra("wifi_state", 0)){
                //wifi状态变成关闭
                case 1:             
                    adapter.clear();
                    stateText.setText("Wifi已关闭");
                    break;
                //WiFi状态变成打开
                case 3:
                    stateText.setText("Wifi已打开");           
                    break;
                //热点状态变成打开
                case 13
                    apstateText.setText("热点已打开");       
                    break;
                //热点状态变成关闭
                case 11:
                    apstateText.setText("热点已关闭");
                    break;
                    default:
                        Log.d("STATE",String.valueOf(intent.getIntExtra("wifi_state", 0)));
                        break;
                }
            }
            //连接状态发生改变
            else if(intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION))
            {
                boolean b = false;
                //获取当前的连接状态
                boolean a = intent.getBooleanExtra("noConnectivity", b);
                if(!a)
                {       
                    //wifi连接成功,获取连接的wifi属性          
                    System.out.println("连接成功");                                 
                }
                else
                {
                    //wifi已断开连接
                    System.out.println("断开连接");             
                }               
            }
            //wifi连接请求成功或失败
            else if(intent.getAction().equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION)) {
                //获取连接wifi属性跟请求连接状态
                WifiInfo info = wifiManager.getConnectionInfo();  
                SupplicantState state = info.getSupplicantState();  
                int flag =0;
                boolean connectflag = false;
                //连接请求成功
                if (state == SupplicantState.COMPLETED) {   
                    Log.i("WifiReceiver", "(验证成功)");
                    SSIDText.setText(info.getSSID().substring(1,info.getSSID().length()-1));
                    //保存连接wifi信息
                    wifiManager.saveConfiguration();
                    flag =1;
                }
                //获取请求失败的错误值,判断是否属于验证失败  
                int errorCode = intent.getIntExtra(  
                        WifiManager.EXTRA_SUPPLICANT_ERROR, -1);  
                if (errorCode == WifiManager.ERROR_AUTHENTICATING) {            
                    Log.i("WifiReceiver", "(验证失败)");           
                }
            }
        }
    }
5、在扫描到wifi后获取wifi的具体属性:
//参数:扫描到的wifi列表
public String[] getString(List<ScanResult> wifiList)
    {
        ArrayList<String> listStr = new ArrayList<String>();
        for (int i = 0; i < wifiList.size(); i++)
        {
            /*SSID:wifi的标示符,也就是名字
             *capabilities:描述接入点支持的身份验证、密钥管理和加密方案
             *level:wifi的信号强度
             *WifiManager.calculateSignalLevel:将信号强度转换成信号等级
            */      
            listStr.add(scan.SSID+":"
                +scan.capabilities+":"
                +String.valueOf(WifiManager.calculateSignalLevel(scan.level, 5)));
        }
        return listStr.toArray(new String[0]);
    }
6、获取当前wifi连入点的一些常用信息
WifiInfo connectInfo = wifiManager.getConnectionInfo();
//连接wifi的名字
connectInfo.getSSID();
//wifi的连接速度跟单位
connectInfo.getLinkSpeed();
connectInfo.LINK_SPEED_UNITS;
//连接wifi的ip地址
connectInfo.getIpAddress();
//用下面的转换方法将connectInfo.getIpAddress()转换成String
public String intToIp(int i) {return ((i >> 24 ) & 0xFF ) + "."
            +  ((i >> 16 ) & 0xFF) + "." +  ((i >> 8 ) & 0xFF) + "." +  ( i & 0xFF) ;  }  
7、创建wifi信息用于wifi连接,分为无密码、WPA两种:
    /*无密码连接:
     *SSID:wifi的标识符
     *config:用于wifi连接的wifi信息
    */
    String SSID = ssid;  
    WifiConfiguration config = new WifiConfiguration();  
    config.allowedAuthAlgorithms.clear();  
    config.allowedGroupCiphers.clear();  
    config.allowedKeyManagement.clear();  
    config.allowedPairwiseCiphers.clear();  
    config.allowedProtocols.clear();  
    config.SSID = "\"" + SSID + "\"";  
    config.allowedAuthAlgorithms  
            .set(WifiConfiguration.AuthAlgorithm.SHARED);  
    config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);  
    config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);  
    config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);  
    config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);  
    config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);  
    /*有密码连接:
     *SSID:wifi的标识符
     *password:wifi密码
     *config:用于wifi连接的wifi信息
     */
    String gol_password = password;  
    WifiConfiguration config = new WifiConfiguration();  
    config.SSID = "\"" + ssid + "\"";  
    config.preSharedKey = "\"" + gol_password + "\"";  
    config.hiddenSSID = true;  
    config.status = WifiConfiguration.Status.ENABLED;  
    config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);  
    config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);  
    config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);  
    config.allowedPairwiseCiphers  
            .set(WifiConfiguration.PairwiseCipher.TKIP);  
    config.allowedPairwiseCiphers  
            .set(WifiConfiguration.PairwiseCipher.CCMP);  
    config.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
    //使用上面新建的WifiConfiguration config连接wifi:
    int wcgID = wifiManager.addNetwork(wifiConfig);
    //连接成功返回true,失败返回false
    boolean flag = wifiManager.enableNetwork(wcgID, true);
8、wifi断开连接:
//SSID:wifi的标示符
public boolean disconnectWifi(String SSID)
{
    List<WifiConfiguration> existingConfigs = null;
    existingConfigs = wifiManager.getConfiguredNetworks();;
    for (WifiConfiguration existingConfig : existingConfigs) {  
        if (existingConfig.SSID.equals("\"" + SSID + "\"")) {
            if(wifiManager.disableNetwork(existingConfig.networkId))
            {
                return true;
            }else break;
        }  
    }
    return false;
}
9、判断wifi信息是否已保存:
public  WifiConfiguration isSaveConfigtion(String SSID)
{   
    List <WifiConfiguration>  existingConfigs = null;
    existingConfigs = wifiManager.getConfiguredNetworks();;
    for (WifiConfiguration existingConfig : existingConfigs) {  
        if (existingConfig.SSID.equals("\"" + SSID + "\"")) {
            return existingConfig;
        }  
    }
    return null;
}
10、删除保存的wifi信息:
public boolean removeWifi(String SSID)
{
    List<WifiConfiguration> existingConfigs;
    existingConfigs= wifiManager.getConfiguredNetworks();  
    for (WifiConfiguration existingConfig : existingConfigs) {  
        if (existingConfig.SSID.equals("\"" + SSID + "\"")) {  
            return wifiManager.removeNetwork(existingConfig.networkId);  
        }  
    }
    return false;
}
至此wifi的打开、关闭、扫描、连接、断开等基本功能的开发就基本结束了,但是在日常的wifi使用中,我们不仅仅只是连接热点,有时也会开启安卓上的本地热点供其它安卓设备连接,所以下面的部分就是设置本地的wifi热点信息并打开等功能。
11、热点跟wifi不能同时使用,所以在打开热点前需先关闭掉wifi
//先判断wifi是否处于打开的状态,如果是则先关闭再打开热点
if(wifiManager.isWifiEnabled()){                    
    wifiManager.setWifiEnabled(false);
    Toast.makeText(MainActivity.this, "关闭当前wifi,创建热点", Toast.LENGTH_SHORT).show();
}
创建热点信息:分为有密码、无密码
/*无密码热点:
*SSID:热点名字
*config:热点信息
*/
WifiConfiguration config = new WifiConfiguration();
config.SSID = ssid;
config.wepTxKeyIndex = 0;          
config.wepKeys[0] = "";
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
config.wepTxKeyIndex = 0;
/*有密码热点:
*SSID:热点名字
*password:热点密码
*config:热点信息
*/
config.hiddenSSID = true;
config.preSharedKey = password;
config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
config.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
使用上面创建的热点信息打开热点
//config:热点信息,打开热点
Method method1 = null;                      
try {            
     method1 = wifiManager.getClass().getMethod("setWifiApEnabled",
             WifiConfiguration.class, boolean.class);
     method1.invoke(wifiManager, config, true);
 } catch (Exception e) {
     e.printStackTrace();
 }
//判断热点是否处于打开状态:
try {
    Method method = wifiManager.getClass().getMethod("isWifiApEnabled");
    method.setAccessible(true);
    return (Boolean) method.invoke(wifiManager);    
} catch (NoSuchMethodException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
} catch (Exception e) {
     e.printStackTrace();
}
//关闭热点,先判断热点是否已被打开,是则关闭
 if (isWifiApEnabled(wifiManager)) {         
    Method method = wifiManager.getClass().getMethod("getWifiApConfiguration");
    method.setAccessible(true);
    WifiConfiguration config = (WifiConfiguration) method.invoke(wifiManager);
    Method method2 =wifiManager.getClass()
        .getMethod("setWifiApEnabled",WifiConfiguration.class, boolean.class);
    method2.invoke(wifiManager, config, false);
}
到了这里安卓的wifi使用就已完成了,包括了wifi跟热点两大部分,wifi部分主要包括扫描、配置、连接断开等,热点部分主要是配置热点信息并打开。