Android开发学习之Android-WIFI(扫描 连接)
小职 2021-06-02 来源 :「XiaoLi_Ya」原文链接:https://blog.csdn.net/XiaoLi_Ya/ar 阅读 2876 评论 0

摘要:本篇主要介绍了Android开发学习之Android-WIFI(扫描 连接),通过具体的内容展现,希望对Android 开发的学习有所帮助。

本篇主要介绍了Android开发学习之Android-WIFI(扫描 连接),通过具体的内容展现,希望对Android 开发的学习有所帮助。

Android开发学习之Android-WIFI(扫描 连接)

公司想着把自己的产品(中央报警器)设置为主页面让用户永远只能在这款产品上面进行一个操作,当时我写的时候连接WIFI是需要进入系统设置页面去连接的(主要是当时我也不会写WIFI功能啊!!!)然后不想什么就来什么了!产品让我把WIFI功能写一下(嘤嘤嘤,我才是刚入Android的小白,我怎么写啊!脑阔疼脑阔疼)


需求

获取wifi列表 显示wifi强度 连接wifi 显示wifi连接信息(只是我理解出来的,当时产品说让我写个wifi脱离系统QAQ,wifi脱离系统是怎么个连接wifi法?问他也是说:这是你的专业范围,你自己去理解。微笑面对一切)


然后发了一顿牢骚:没做过呀,我不会啊,这怎么写啊,闲聊两小时不如百度一分钟(其实是差不多把所有wifi的案例都看完了)


网上有很多关于获取wifi列表,并连接wifi的文章,然后我每一篇都点来看看。然后发现,耶,还蛮有趣的!一如研究深似海,发现了各种问题,然后自己记在小本本上,万一我遇见了呢?是不是就不用死的太惨了~


权限

虽然是刚入Android的小白,但是发现安卓的每一次更新都是权限的加强,刚开始的时候就是给权限折磨的要死!!!记得我写电话短信功能的时候,给了权限但是就是拨打不了手机号也发送不了短信,后面还是给了权限在手动打开,下面献上关于wifi的权限好叭!!!


<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" ></uses-permission>

<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" ></uses-permission>

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" ></uses-permission>

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" ></uses-permission>


你们以为这就完了???哇,太天真了叭。确实,很老很老的版本确实可以这样就完事了,但是6.0版本后的就需要定位了叭(这个是我网上看到的,不是我也不知道,反正我知道现在是需要就对了嘻嘻)继续给大家献上后面的权限


<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>、

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>


好了,你权限都加完了。但是发现还是不行,你就跑过来问我,小李怎么回事啊?不行啊,我都加了权限了为什么还是获取不到wifi的列表呢?(呆子!!!我都说了要手动打开手动打开了!不知道怎么手动打开嘛?那我继续把代码给你好了呀!满意了叭)


if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(

                Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED ) {

            requestPermissions(new String[] { Manifest.permission.CALL_PHONE,Manifest.permission.ACCESS_COARSE_LOCATION},

                    0x1234);

        }


你们也可以用这种方式去手动打开其他的权限,百度上一大堆(百度yyds!!!)

权限的问题解决了那就是编码了!但你打开权限你就成功了一半了!反正我是这么认为的,编码嘛easy啦!


编码部分

掐指一算,有些人是不是会问,既然权限给了,我怎么编码扫描wifi呢?

唉,那你是真的跟三天前的我一样,啥也不会啊我的宝,给你吧给你吧,谁要小李心好呢?

扫描wifi


public void startScan() {

wifiManager.startScan();

// 扫描返回结果列表

scanResultList = wifiManager.getScanResults();

// 扫描配置列表

wifiConfigList = wifiManager.getConfiguredNetworks();

}


噗嗤,你不会还要我教你怎么去显示叭?哎呀,这个也就几行代码的事情了呀


@SuppressLint("NewApi")

private ArrayList<WifiElement> getAllNetWorkList() {

        // 每次点击扫描之前清空上一次的扫描结果

        mWifiElementList.clear();

        if(mWifiAdmin.isWifiEanbled()){

            // 开始扫描网络

            mWifiAdmin.startScan();

        }else{

            Toast.makeText(getApplicationContext(), "请先打开wifi!", Toast.LENGTH_SHORT).show();

        }

        mScanResultList = mWifiAdmin.getWifiList();

        wifiConfigList = mWifiAdmin.getWifiConfigList();

        WifiElement element;

        if (mScanResultList != null) {

            for (int i = 0; i < mScanResultList.size(); i++) {

                // 得到扫描结果

                mScanResult = mScanResultList.get(i);

                if (!mScanResult.SSID.equals("") || mScanResult.SSID == ""){

                    element = new WifiElement();

                    element.setSsid(mScanResult.SSID);

                    element.setBssid(mScanResult.BSSID);

                    element.setStatus(cheackStatus(mScanResult.SSID));

                    element.setFrequency(mScanResult.frequency);

                    element.setLevel(mScanResult.level);

                    mWifiElementList.add(element);

                }

            }

        }

        return mWifiElementList;

    }


还有显示内容的容器啊这些就不用我在多写了叭?(要源码的可以私聊我,我直接给你!小李有点懒,不想都写了!!!)


wifi开关变化


 @Override

    public void onClick(View v) {

        // TODO Auto-generated method stub

        switch (v.getId()) {

            case R.id.wifi_conn_switch_btn:

                mWifiConnAdapter = new WifiConnListAdapter(getApplicationContext(), getAllNetWorkList());

                mLvWifiConInfo.setAdapter(mWifiConnAdapter);

                break;

            case R.id.wifi_conn_scan_btn:

                if (isOpen) {

                    Toast.makeText(getApplicationContext(), "正在关闭wifi", Toast.LENGTH_SHORT).show();

                    if (mWifiAdmin.closeWifi()) {

                        Toast.makeText(getApplicationContext(), "wifi关闭成功", Toast.LENGTH_SHORT).show();

                        mBtnWifiScan.setText("打开wifi");

                        isOpen = false;

                    } else {

                        Toast.makeText(getApplicationContext(), "wifi关闭失败", Toast.LENGTH_SHORT).show();

                    }

                } else {

                    Toast.makeText(getApplicationContext(), "正在打开wifi", Toast.LENGTH_SHORT).show();

                    if (mWifiAdmin.OpenWifi()) {

                        Toast.makeText(getApplicationContext(), "wifi打开成功", Toast.LENGTH_SHORT).show();

                        mBtnWifiScan.setText("关闭wifi");

                        isOpen = true;

                    } else {

                        Toast.makeText(getApplicationContext(), "wifi打开失败", Toast.LENGTH_SHORT).show();

                    }

                }

                break;

            default:

                break;

        }

    }


打开wifi


public boolean OpenWifi() {

boolean bRet = true;

if (!wifiManager.isWifiEnabled()) {

bRet = wifiManager.setWifiEnabled(true);

}

return bRet;

}


关闭wifi


public boolean closeWifi() {

if (!wifiManager.isWifiEnabled()) {

return true;

} else {

return wifiManager.setWifiEnabled(false);

}

}


连接wifi

这里的话肯定是要去传入它必要的几个参数啊

就比如ssid pwd type


private WifiConfiguration CreateWifiInfo(String SSID, String Password,

WifiCipherType Type) {

WifiConfiguration wc = new WifiConfiguration();

wc.allowedAuthAlgorithms.clear();

wc.allowedGroupCiphers.clear();

wc.allowedKeyManagement.clear();

wc.allowedPairwiseCiphers.clear();

wc.allowedProtocols.clear();

wc.SSID = "\"" + SSID + "\"";

if (Type == WifiCipherType.WIFICIPHER_NOPASS) {

wc.wepKeys[0] = "";

wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);

wc.wepTxKeyIndex = 0;

} else if (Type == WifiCipherType.WIFICIPHER_WEP) {

wc.wepKeys[0] = "\"" + Password + "\"";

wc.hiddenSSID = true;

wc.allowedAuthAlgorithms

.set(WifiConfiguration.AuthAlgorithm.SHARED);

wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);

wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);

wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);

wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);

wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);

wc.wepTxKeyIndex = 0;

// System.out.println(wc.preSharedKey);

System.out.println(wc);

} else if (Type == WifiCipherType.WIFICIPHER_WPA) {

wc.preSharedKey = "\"" + Password + "\"";

wc.hiddenSSID = true;

// 用来判断加密方法。

// 可选参数:LEAP只用于leap,

// OPEN 被wpa/wpa2需要,

// SHARED需要一个静态的wep key

wc.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);

// 用来判断加密方法。可选参数:CCMP,TKIP,WEP104,WEP40

wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);

wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);

// WifiConfiguration.KeyMgmt 键管理机制(keymanagerment),使用KeyMgmt 进行。

// 可选参数IEEE8021X,NONE,WPA_EAP,WPA_PSK

wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);

// WifiConfiguration.PairwiseCipher 设置加密方式。

// 可选参数 CCMP,NONE,TKIP

wc.allowedPairwiseCiphers

.set(WifiConfiguration.PairwiseCipher.TKIP);

wc.allowedPairwiseCiphers

.set(WifiConfiguration.PairwiseCipher.CCMP);

// WifiConfiguration.Protocol 设置一种协议进行加密。

// 可选参数 RSN,WPA,

wc.allowedProtocols.set(WifiConfiguration.Protocol.WPA); // for WPA

wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN); // for WPA2

// wifiConfiguration.Status 获取当前网络的状态。

} else {

return null;

}

return wc;

}


我是小职,记得找我

✅ 解锁高薪工作

✅ 免费获取基础课程·答疑解惑·职业测评

Android开发学习之Android-WIFI(扫描 连接)

本文由 @小职 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程