Android wifi 掃描、連接

概述

工作需要用到掃描附近wifi并連接到指定wifi功能,在這里做一個(gè)記錄。在Android 7.0 和 8.1 都測(cè)試過都可用。代碼來源網(wǎng)絡(luò)。掃描并連接指定wifi包括以下4個(gè)步驟:

  • 授權(quán)
  • 掃描附近的wifi
  • 注冊(cè)廣播監(jiān)聽wifi狀態(tài)變化
  • 連接指定的wifi

授權(quán)

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    //要定位權(quán)限才能搜索wifi
    PermissionUtil.requestEach(this, new PermissionUtil.OnPermissionListener() {
        @Override
        public void onSucceed() {
            //授權(quán)成功后打開wifi
            scanWifiInfo();
        }

        @Override
        public void onFailed(boolean showAgain) {

        }
    }, PermissionUtil.LOCATION);

掃描附近的wifi

    /**
     * 掃描附近wifi
     */
    private void scanWifiInfo() {
        String wserviceName = Context.WIFI_SERVICE;
        WifiManager mWifiManager = (WifiManager) getSystemService(wserviceName);

        mWifiManager.setWifiEnabled(true);
        mWifiManager.startScan();

        mWifiList.clear();
        mWifiList = mWifiManager.getScanResults();

        if(mWifiList != null && mWifiList.size() > 0) {
            adapter = new ListAdapter(this, mWifiList);
            listView.setAdapter(adapter);
            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    //連接wifi
                    ScanResult scanResult = mWifiList.get(position);
                    connectWifi(scanResult.SSID, "ILOVEYOU", "WPA");
                }
            });
        }
    }

注冊(cè)廣播監(jiān)聽wifi狀態(tài)變化

    @Override
    public void onResume() {
        super.onResume();
        //注冊(cè)廣播
        wifiReceiver = new WifiBroadcastReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);//監(jiān)聽wifi是開關(guān)變化的狀態(tài)
        filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);//監(jiān)聽wifiwifi連接狀態(tài)廣播
        filter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);//監(jiān)聽wifi列表變化(開啟一個(gè)熱點(diǎn)或者關(guān)閉一個(gè)熱點(diǎn))
        registerReceiver(wifiReceiver, filter);
    }

    @Override
    public void onPause() {
        super.onPause();
        //取消監(jiān)聽
        unregisterReceiver(wifiReceiver);
    }
    //監(jiān)聽wifi狀態(tài)廣播接收器
    public class WifiBroadcastReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {

            if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(intent.getAction())) {

                int state = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 0);
                switch (state) {
                    /**
                     * WIFI_STATE_DISABLED    WLAN已經(jīng)關(guān)閉
                     * WIFI_STATE_DISABLING   WLAN正在關(guān)閉
                     * WIFI_STATE_ENABLED     WLAN已經(jīng)打開
                     * WIFI_STATE_ENABLING    WLAN正在打開
                     * WIFI_STATE_UNKNOWN     未知
                     */
                    case WifiManager.WIFI_STATE_DISABLED: {
                        Log.i(TAG, "已經(jīng)關(guān)閉");
                        break;
                    }
                    case WifiManager.WIFI_STATE_DISABLING: {
                        Log.i(TAG, "正在關(guān)閉");
                        break;
                    }
                    case WifiManager.WIFI_STATE_ENABLED: {
                        Log.i(TAG, "已經(jīng)打開");
//                        sortScaResult();
                        break;
                    }
                    case WifiManager.WIFI_STATE_ENABLING: {
                        Log.i(TAG, "正在打開");
                        break;
                    }
                    case WifiManager.WIFI_STATE_UNKNOWN: {
                        Log.i(TAG, "未知狀態(tài)");
                        break;
                    }
                }
            } else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(intent.getAction())) {
                NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
                Log.i(TAG, "--NetworkInfo--" + info.toString());
                if (NetworkInfo.State.DISCONNECTED == info.getState()) {//wifi沒連接上
                    Log.i(TAG, "wifi沒連接上");
                } else if (NetworkInfo.State.CONNECTED == info.getState()) {//wifi連接上了
                    Log.i(TAG, "wifi連接上了");
                } else if (NetworkInfo.State.CONNECTING == info.getState()) {//正在連接
                    Log.i(TAG, "wifi正在連接");
                }
            } else if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(intent.getAction())) {
                Log.i(TAG, "網(wǎng)絡(luò)列表變化了");
            }
        }
    }

連接指定的wifi

    /**
     * 連接wifi
     * @param targetSsid wifi的SSID
     * @param targetPsd 密碼
     * @param enc 加密類型
     */
    @SuppressLint("WifiManagerLeak")
    public void connectWifi(String targetSsid, String targetPsd, String enc) {
        // 1、注意熱點(diǎn)和密碼均包含引號(hào),此處需要需要轉(zhuǎn)義引號(hào)
        String ssid = "\"" + targetSsid + "\"";
        String psd = "\"" + targetPsd + "\"";

        //2、配置wifi信息
        WifiConfiguration conf = new WifiConfiguration();
        conf.SSID = ssid;
        switch (enc) {
            case "WEP":
                // 加密類型為WEP
                conf.wepKeys[0] = psd;
                conf.wepTxKeyIndex = 0;
                conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
                conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
                break;
            case "WPA":
                // 加密類型為WPA
                conf.preSharedKey = psd;
                break;
            case "OPEN":
                //開放網(wǎng)絡(luò)
                conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
        }
        //3、鏈接wifi
        WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        wifiManager.addNetwork(conf);
        List<WifiConfiguration> list = wifiManager.getConfiguredNetworks();
        for (WifiConfiguration i : list) {
            if (i.SSID != null && i.SSID.equals(ssid)) {
                wifiManager.disconnect();
                wifiManager.enableNetwork(i.networkId, true);
                wifiManager.reconnect();
                break;
            }
        }
    }

最后附上代碼的 GitHub地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 網(wǎng)絡(luò)連接處理 在說WiFi之前,先來說說網(wǎng)絡(luò)連接處理。在Android開發(fā)過程中,對(duì)于一個(gè)需要連接網(wǎng)絡(luò)的Andro...
    Reathin閱讀 39,592評(píng)論 19 71
  • 緣起 最近有個(gè)需求,要求App能夠自動(dòng)掃描到某個(gè)熱點(diǎn)然后自動(dòng)連接上熱點(diǎn)。背景是我們公司屬于IoT行業(yè),這個(gè)熱點(diǎn)是設(shè)...
    your_genius閱讀 11,786評(píng)論 0 6
  • 引子 安卓中關(guān)于系統(tǒng)開發(fā)的文章比較少, 而且較為不全面. 對(duì)于剛剛接觸做系統(tǒng)應(yīng)用的開發(fā)的開發(fā)者而言, 在自己動(dòng)手開...
    迷你小豬閱讀 16,580評(píng)論 6 21
  • 最近項(xiàng)目使用藍(lán)牙,之前并沒有接觸,還是發(fā)現(xiàn)了很多坑,查閱了很多資料,說的迷迷糊糊,今天特查看官方文檔。 說下遇到的...
    King9527閱讀 1,919評(píng)論 0 1
  • 我想一次性付費(fèi),閱讀所有 Tasker 中文用戶指南哦?OK,請(qǐng)?jiān)L問此鏈接 原創(chuàng)內(nèi)容,未經(jīng)本人授權(quán)不得轉(zhuǎn)載
    blackspot閱讀 1,512評(píng)論 0 1

友情鏈接更多精彩內(nèi)容