Android wifi 使用与工具类

1.背景需求

根据客户需求,在Android系统的WIFI模块的基础上,对WIFI机能进行自定义开发。主要还是调用Android中WIFI相关的API,具体的实现过程后续会详细讲解。

2.开发流程

(1)注册WIFIBroadcastReceiver.
    WIFI的开关状态,连接状态等都是通过系统的广播通知的,我们需要WIFIBroadcastReceiver来接收WIFI的各种状态通知。

    注册之前,先需要添加相关的权限,否则无法收到系统广播
    //允许程序读写系统安全敏感的设置项
    <permission android:name="android.permission.WRITE_SECURE_SETTINGS"/>           
    //允许程序改变网络连接状态
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />      
    //改变WLAN状态的开关
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />         
    //获取网络信息状态
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />      
    //获取使用Wi-Fi等WLAN无线网络
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />  

    对于BroadcastReceiver的注册方式,可以有两种:
    ①动态注册(代码中实现)
        m_broadCastReceiver = SysMangerWIFIBroadcastReceiver.getInstance();
        m_intentFilter = new IntentFilter();
        m_intentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
        m_intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
        m_intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
        m_intentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
        m_intentFilter.addAction(WifiClient.ACTION_WPS_PROGRESS_CHANGED);
        m_intentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
        context.registerReceiver(m_broadCastReceiver, m_intentFilter);

    ②Manifest文件中注册
        <receiver android:name=".SysMangerWIFIBroadcastReceiver" >
            <intent-filter>
                <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                <action android:name="android.net.wifi.STATE_CHANGE" />
                ......
            </intent-filter>
        </receiver>

(2)新建SysMangerWIFIBroadcastReceiver.java类继承BroadcastReceiver.
    代码中接收WIFI通知,处理相关的事件。
    public void onReceive(Context arg0, Intent arg1) {

        //get the status of wifi
        if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(arg1.getAction())) {
            int wifiState = arg1.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 0);
            switch (wifiState) {
            case WifiManager.WIFI_STATE_DISABLED:
                //SysLog.out(TAG, "onReceive", "wifi disabled");
            break;
            case WifiManager.WIFI_STATE_DISABLING:
                //SysLog.out(TAG, "onReceive", "wifi disabling");
            break;
            case WifiManager.WIFI_STATE_ENABLED:
                //SysLog.out(TAG, "onReceive", "wifi enabled");
            break;
            case WifiManager.WIFI_WIFI_STATE_ENABLING:
                //SysLog.out(TAG, "onReceive", "wifi enabling");
            break;
        }

        //get the notification of pwd error
        if(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION.equals(arg1.getAction())){
            int State = arg1.getIntExtra(WifiManager.EXTRA_SUPPLICANT_ERROR, 0);
            if(State==WifiManager.ERROR_AUTHENTICATING){
                //SysLog.out(TAG,"onReceive" , "wificonnect failure(pwd error)");
            }

        }

        //get the notification of wpsconnect
        if (WifiClient.ACTION_WPS_PROGRESS_CHANGED.equals(arg1.getAction())) {
            int status = arg1.getIntExtra(
                    WifiClient.EXTRA_WPS_PROGRESS_STATE, -1);
            switch (status) {
            case WifiClient.WPS_PROGRESS_START_COMPLETION:
                //SysLog.out(TAG, "onReceive", "Wps Completion");
            break;
            case WifiClient.WPS_PROGRESS_START_FAILURE:
                //SysLog.out(TAG, "onReceive", "Wps Start Failure");
            break;
            case WifiClient.WPS_PROGRESS_START_SUCCESS:
                //SysLog.out(TAG, "onReceive", "Wps Start Success");
            break;
            case WifiClient.WPS_PROGRESS_CANCEL_FAILURE:
                //SysLog.out(TAG, "onReceive", "Wps Cancel Failure");
            break;
        }

        //get the notification of  AP connected
        if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(arg1.getAction())) {  
            Parcelable parcelableExtra = arg1.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);  
                    if (null != parcelableExtra) {  
                        NetworkInfo wifi = (NetworkInfo) parcelableExtra;  

                        if (wifi != null) {
                            if (NetworkInfo.State.CONNECTED == wifi.getState()) {
                                //SysLog.out(TAG, "onReceive", "wifi connected");
                            }else if(NetworkInfo.State.DISCONNECTING == wifi.getState()){
                                //SysLog.out(TAG, "onReceive", "wifi disconnecting");   
                            }else if (NetworkInfo.State.DISCONNECTED == wifi.getState()) {
                                //SysLog.out(TAG, "onReceive", "wifi disconnected");
                            }else if (NetworkInfo.State.CONNECTING == wifi.getState()) {
                            //SysLog.out(TAG, "onReceive", "wifi connecting");
                            }

                        }
                    }

} 3.开发流程

上篇讲到注册相关的BroadcastReceiver以及通过BroadcastReceiver来获取WIFI的各种通知,本篇接着上一篇来解析WIFI开发的过程,现在我们需要新建操作WIFI的工具类SysManagerWIFIUtil.java.
    private SysManagerWIFIAdmin(Context context) {
        m_context = context;
        mWifiManager = (WifiManager) context
                .getSystemService(Context.WIFI_SERVICE);
    }

    public static SysManagerWIFIUtil getInstance(Context context) {
        if (null == m_instance) {
            SysLog.out(TAG, "SysManagerWIFIUtil getInstance", "create singleton instance");
            synchronized (SysManagerWIFIUtil.class) {
                if (null == m_instance) {
                    m_instance = new SysManagerWIFIUtil(context);
                }
            }
        }
        return m_instance;
    }

    public void openWifi() {
        if (!mWifiManager.isWifiEnabled()) {
            mWifiManager.setWifiEnabled(true);
        }
    }

    public void closeWifi() {
        if (mWifiManager.isWifiEnabled()) {
            mWifiManager.setWifiEnabled(false);
        }
    }

    public int checkState() {
        return mWifiManager.getWifiState();
    }

    public WifiManager getWifiManager() {
        return mWifiManager;
    }

    public synchronized List<WifiConfiguration> getConfiguration() {
        // saved AP
        mWifiConfiguration = mWifiManager.getConfiguredNetworks();
        return mWifiConfiguration;
    }

    public synchronized WifiInfo getConnectionInfo() {
        mWifiInfo = mWifiManager.getConnectionInfo();
        // SysLog.out(TAG, "connect", "" + mWifiInfo.toString());
        return mWifiInfo;
    }

    // connect savedAP
    public boolean connectConfiguration(int netid) {
        if (netid < -1) {
            return false;
        }
        SysLog.out(TAG, "SysManagerWIFIAdmin enableNetwork", "start");
        boolean c = mWifiManager.enableNetwork(netid, true);
        return c;
    }

    public synchronized void saveConfiguration() {
        SysLog.out(TAG, "SysManagerWIFIAdmin saveConfiguration", "start");
        mWifiManager.saveConfiguration();
    }

    public synchronized void startScan() {
        SysLog.out(TAG, "SysManagerWIFIAdmin startScan", "start");
        mWifiManager.startScan();
    }

    public synchronized List<ScanResult> getWifiList() {
        // scaned AP
        mWifiList = mWifiManager.getScanResults();
        return mWifiList;
    }

    public synchronized String getMacAddress() {
        if (mWifiManager.isWifiEnabled()) {
            mWifiInfo = mWifiManager.getConnectionInfo();
            return (mWifiInfo == null) ? "NULL" : mWifiInfo.getMacAddress();
        }
        return null;
    }


    public synchronized String getBSSID() {
        if (mWifiManager.isWifiEnabled()) {
            mWifiInfo = mWifiManager.getConnectionInfo();
            return (mWifiInfo == null) ? "NULL" : mWifiInfo.getBSSID();
        }
        return "";
    }

    public synchronized String getSSID() {
        if (mWifiManager.isWifiEnabled()) {
            mWifiInfo = mWifiManager.getConnectionInfo();
            return (mWifiInfo == null) ? "NULL" : mWifiInfo.getSSID();
        }
        return "";
    }

    public synchronized int getIPAddress() {
        if (mWifiManager.isWifiEnabled()) {
            mWifiInfo = mWifiManager.getConnectionInfo();
            return (mWifiInfo == null) ? 0 : mWifiInfo.getIpAddress();
        }
        return 0;
    }

    public synchronized int getNetworkId() {
        if (mWifiManager.isWifiEnabled()) {
            mWifiInfo = mWifiManager.getConnectionInfo();
            return (mWifiInfo == null) ? 0 : mWifiInfo.getNetworkId();
        }
        return 0;
    }

    public synchronized boolean deleteConfiguration(int netId) {
        SysLog.out(TAG, "SysManagerWIFIAdmin deleteConfiguration", "start");
        boolean b = mWifiManager.removeNetwork(netId);
        return b;
    }

    public synchronized int addNetwork(String ssid, String passwd, int type,
            String bssid) {
        SysLog.out(TAG, "SysManagerWIFIAdmin addNetwork", "start");
        int status = addNetwork(CreateWifiInfo(ssid, passwd, type, bssid));
        return status;
    }

    // add net and connect
    private int addNetwork(WifiConfiguration wcg) {
        int wcgID = mWifiManager.addNetwork(wcg);
        SysLog.out(TAG, "SysManagerWIFIAdmin addNetwork(enableNetwork)",
                "start"+", netID = "+wcgID);
        boolean b = mWifiManager.enableNetwork(wcgID, true);
        getConnectionInfo();
        return wcgID;
    }

    private WifiConfiguration CreateWifiInfo(String SSID, String Password,
            int Type, String BSSID) {
        WifiConfiguration config = new WifiConfiguration();
        config.allowedAuthAlgorithms.clear();
        config.allowedGroupCiphers.clear();
        config.allowedKeyManagement.clear();
        config.allowedPairwiseCiphers.clear();
        config.allowedProtocols.clear();
        config.SSID =  toHexString(SSID.getBytes());
        SysLog.out(TAG, "SysManagerWIFIAdmin addNetwork", "SSID="+config.SSID);

        if (null == BSSID) {
        } else {
            config.BSSID = BSSID;
        }
        if ((null != SSID)&&(null != BSSID)) {
            WifiConfiguration tempConfig = this.IsExsits(SSID,BSSID);
            if (tempConfig != null) {
                mWifiManager.removeNetwork(tempConfig.networkId);
            }
        }

        if (TYPE_NO_PASSWD == Type) // WIFICIPHER_NOPASS
        {
            config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
        } else if (TYPE_WEP == Type) { // WIFICIPHER_WEP
            config.hiddenSSID = true;
            int len = Password.length();
            if ((len == 10 || len == 26 || len == 58)
                    && Password.matches("[0-9A-Fa-f]*")) {
                config.wepKeys[0] = Password;
            } else {
                config.wepKeys[0] = '"' + Password + '"';
            }
            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);
            config.wepTxKeyIndex = 0;
        } else if (TYPE_WPA == Type) { // WIFICIPHER_WPA
            if (Password.matches("[0-9A-Fa-f]{64}")) {
                config.preSharedKey = Password;
            } else {
                config.preSharedKey = '"' + Password + '"';
            }

            config.hiddenSSID = true;
            config.allowedAuthAlgorithms
                    .set(WifiConfiguration.AuthAlgorithm.OPEN);
            config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
            config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
            config.allowedPairwiseCiphers
                    .set(WifiConfiguration.PairwiseCipher.TKIP);
            config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
            config.allowedPairwiseCiphers
                    .set(WifiConfiguration.PairwiseCipher.CCMP);
            config.status = WifiConfiguration.Status.ENABLED;
        } else {

        }
        return config;
    }

    public int isWifiContected(Context context) {
        ConnectivityManager connectivityManager = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo wifiNetworkInfo = connectivityManager
                .getNetworkInfo(ConnectivityManager.TYPE_WIFI);

        if (wifiNetworkInfo.isConnected()) {
            return WIFI_CONNECTED;
        } else {
            return WIFI_CONNECT_FAILED;
        }
    }

    public WifiConfiguration IsExsits(String SSID,String BSSID) {
        List<WifiConfiguration> existingConfigs = mWifiManager
                .getConfiguredNetworks();
        for (WifiConfiguration existingConfig : existingConfigs) {
            if (null != BSSID && (("\"" + SSID + "\"").equals(existingConfig.SSID))&&(BSSID.equals(existingConfig.BSSID))) {
                return existingConfig;
            }
        }
        return null;
    }

    public synchronized void disconnectWifi(int netId) {
        mWifiManager.disableNetwork(netId);
        if(netId == getNetworkId()){
            mWifiManager.disconnect();
            SysLog.out(TAG, "SysManagerWIFIAdmin disconnectWifi(netID)",
                    "Ap is disconnect = "+netId);
        }
    }

猜你喜欢

转载自blog.csdn.net/qq_32368129/article/details/71195208