Android筆記--WIFI開發

    首先是權限,因爲WIFI也是可以用於定位的,只是精度沒那麼高而已,所以6.0之後的權限系統對WIFI的權限進行了限制,除了需要日常的WIFI操作權限之外,還需要定位權限,否則會獲取不到WIFI的信息。

    <!--完全的網絡訪問權限-->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- 以下是使用wifi訪問網絡所需的權限 -->
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <!--定位權限-->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />

    大體步驟,就是:

        1、顯示列表(已連接、已保存的、已保存但沒信號的等等,需要根據不同的狀態區別顯示並排序)

        2、判定是否已經保存,如果保存了直接連接

        3、沒保存,提示輸入密碼,沒有密碼就跳過

        4、代碼自動將需要連接的WIFI以及密碼,寫入系統保存中,寫了之後再進行連接

    其他需要注意:保存了的忘了有可能也需要修改密碼,SSID不能用作唯一碼,因爲WIFI名稱是有可能是一樣的。

    下面是工具類代碼:

package com.imxiaoyu.common.utils;

import android.app.Activity;
import android.content.Context;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.text.TextUtils;

import com.imxiaoyu.common.base.helper.BaseHelper;

import java.util.List;

/**
 * WIFI連接工具類
 * Created by 龐光渝 on 2017/3/1.
 */

public class WifiUtils extends BaseHelper {

    private WifiManager wifiManager;

    public WifiUtils(Activity activity) {
        super(activity);
        wifiManager = (WifiManager) getActivity().getSystemService(Context.WIFI_SERVICE);
        doStartScan();
    }

    /**
     * 掃碼、刷新WIFI
     */
    public void doStartScan() {
        wifiManager.startScan();
    }


    /**
     * 是否已經開啓了WIFI
     * @return
     */
    public boolean isWifiOpen(){
        if(wifiManager==null){
            return false;
        }
       return wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLED;
    }

    /**
     * 開、關 WIFI
     *
     * @param bln
     */
    public void doSwitchWifi(boolean bln) {
        if (wifiManager != null) {
            wifiManager.setWifiEnabled(bln);
        }
    }

    /**
     * 返回WIFI列表,並按信號強度排序
     *
     * @return
     */
    public List<ScanResult> getScanResults() {
        return ascWifiLevel(wifiManager.getScanResults());//得到掃描結果
    }

    /**
     * 斷開網絡
     */
    public void disableNetwork(int wifiId){
        wifiManager.disableNetwork(wifiId);
    }

    /**
     * 不保存網絡
     * @param wifiId
     */
    public void removeNetwork(int wifiId){
        wifiManager.removeNetwork(wifiId);
    }

    /**
     * 不保存網絡
     * @param SSID
     */
    public void removeNetwork(String SSID){
        removeNetwork(isConfiguration(SSID));
    }

    /**
     * 返回當前正在連接的WIFI的信息(正在連接,也包括沒連接上或者密碼錯誤狀態,相當於是一個佔位的狀態)
     * @return
     */
    public WifiInfo getWifiInfo(){
        return wifiManager.getConnectionInfo();
    }

    /**
     * 得到配置好的(即已經保存了密碼的)WIFI的信息
     */
    public List<WifiConfiguration> getConfiguration() {
        return wifiManager.getConfiguredNetworks();
    }

    /**
     * 判定指定的WIFI已經配置好,然後根據WIFI的地址bssid返回NETId;
     *
     * @param SSID WifiConfiguration這個列表的SSID是前後帶有雙引號的,傳進來的時候一定要注意
     * @return
     */
    public int isConfiguration(String SSID) {
        List<WifiConfiguration> wifiConfigurations = getConfiguration();
        if(wifiConfigurations!=null) {
            for (int i = 0; i < wifiConfigurations.size(); i++) {
                if (wifiConfigurations.get(i).SSID.equals(SSID)) {//地址相同
                    return wifiConfigurations.get(i).networkId;
                }
            }
        }
        return -1;
    }
    /**
     * 判定指定的WIFI已經配置好,然後根據WIFI的地址bssid返回NETId;
     *
     * @param BSSID WifiConfiguration這個列表的SSID是前後帶有雙引號的,傳進來的時候一定要注意
     * @return
     */
    public int isConfigurationBSSID(String BSSID) {
        List<WifiConfiguration> wifiConfigurations = getConfiguration();
        if(wifiConfigurations!=null) {
            for (int i = 0; i < wifiConfigurations.size(); i++) {
                if (wifiConfigurations.get(i).BSSID!=null&&wifiConfigurations.get(i).BSSID.equals(BSSID)) {//地址相同
                    return wifiConfigurations.get(i).networkId;
                }
            }
        }
        return -1;
    }

    /**
     * 添加指定WIFI的配置信息,原列表不存在此SSID
     *
     * @param wifiList
     * @param ssid
     * @param pwd
     * @return
     */
    public int addWifiConfig(List<ScanResult> wifiList, String ssid, String pwd) {
        int wifiId = -1;
        for (int i = 0; i < wifiList.size(); i++) {
            ScanResult wifi = wifiList.get(i);
            if (wifi.SSID.equals(ssid)) {
                WifiConfiguration wifiCong = new WifiConfiguration();
                wifiCong.SSID = "\"" + wifi.SSID + "\"";//\"轉義字符,代表"
                wifiCong.preSharedKey = "\"" + pwd + "\"";//WPA-PSK密碼
                wifiCong.hiddenSSID = false;
                wifiCong.status = WifiConfiguration.Status.ENABLED;
                wifiId = wifiManager.addNetwork(wifiCong);//將配置好的特定WIFI密碼信息添加,添加完成後默認是不激活狀態,成功返回ID,否則爲-1
                if (wifiId != -1) {
                    return wifiId;
                }
            }
        }
        return wifiId;
    }

    /**
     * 連接指定的WIFI
     *
     * @param wifiId
     * @return
     */
    public boolean doConnectWifi(int wifiId) {
        List<WifiConfiguration> wifiConfigurations = getConfiguration();
        for (int i = 0; i < wifiConfigurations.size(); i++) {
            WifiConfiguration wifi = wifiConfigurations.get(i);
            if (wifi.networkId == wifiId) {
                while (!(wifiManager.enableNetwork(wifiId, true))) {//激活該Id,建立連接
                    //status:0--已經連接,1--不可連接,2--可以連接
                    ALog.e("ConnectWifi", String.valueOf(wifiConfigurations.get(wifiId).status));
                }
                return true;
            }
        }
        return false;
    }

    /**
     * 取消保存
     *
     * @param networkID
     */
    public void removeNetword(int networkID) {
        wifiManager.removeNetwork(networkID);
        wifiManager.saveConfiguration();
    }

    /**
     * 排序一下信號強度
     *
     * @param list
     * @return
     */
    public static List<ScanResult> ascWifiLevel(List<ScanResult> list) {
        for (int i = 0; i < list.size(); i++) {
            for (int j = 0; j < list.size() - 1; j++) {
                if (list.get(j).level < list.get(j + 1).level) {
                    ScanResult scanResult = list.get(j);
                    list.set(j, list.get(j + 1));
                    list.set(j + 1, scanResult);
                }
            }
        }
        return list;
    }

    /**
     * 返回一個WIFI的加密方式
     *
     * @param ssid
     * @return
     */
    public String getCipherType(String ssid) {
        WifiManager wifiManager = (WifiManager) getActivity().getSystemService(Context.WIFI_SERVICE);

        List<ScanResult> list = wifiManager.getScanResults();

        for (ScanResult scResult : list) {
            if (!TextUtils.isEmpty(scResult.SSID) && scResult.SSID.equals(ssid)) {
                String capabilities = scResult.capabilities;
                if (!TextUtils.isEmpty(capabilities)) {

                    if (capabilities.contains("WPA") || capabilities.contains("wpa")) {
                        return "WAP";

                    } else if (capabilities.contains("WEP") || capabilities.contains("wep")) {
                        return "WEP";
                    } else {
                        return null;
                    }
                }
            }
        }
        return null;
    }
}




參考博客:

http://blog.csdn.net/caoliang0921/article/details/8799530
http://www.soso.io/article/100080.html
http://blog.csdn.net/u014774589/article/details/48950727

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章