uni-app安卓获取wifi列表实现wifi打卡

2,761 阅读3分钟

业务逻辑

最近在开发uni-appwifi打卡的功能,在安卓端打算获取wifi列表的唯一标识mac地址,实现将公司的wifi信息添加到数据库里面,之后员工在打开wifi时,获取此wifi的mac地址是否是公司的wifi,如果是的话,就在打卡范围内,可以打卡,如果本机的mac地址不是公司的wifif的mac地址说明连接的不是公司wifi,不能打卡,属于外勤打卡。

实际过程中遇到的问题

在uni-app的api文档中有关于wifi的api,但是比较不规范,不是很好懂,于是复制了其中的第一段代码,发现输出了一些看不懂的状态,并没有输出wifi列表,于是继续往下走,复制了第二段代码,发现有输出了,但是只是输出的是ssid即wifi名字没有mac地址,看了用不成。 于是在插件市场里面找了,除了一个安卓wifi手机助手的插件免费其他的收费,于是果断下载这个案例,看看,一顿操作,页面出来了,点初始化按钮再点wifi列表,哈哈有东西了,wifi名字和mac地址有了那就可以实现业务逻辑了,但是我将wifi关掉之后再次打卡wifi发现获取不到wifi列表了,于是尝试了各种都是一样的,于是给插件作者五星好评,没想到作者加我qq了,于是将这些bug指给他,但是作者却告诉我他没试过其他手机,只是在他手机上面简单的试了试,觉得没啥问题,最后他告诉我让我调试一下安卓源码,一脸懵逼,作为一个前端小民工,不会安卓于是这个插件只能放弃。

最终的解决方案

最后没办法,老板要求实现这个功能,翻了很多资料还有博客,一无所获,最后我想了想,还是的从uni-app的文档入手,于是我想到了,只是输出ssid的那一段代码,他既然可以输出ssid就一定可以输出mac地址,于是顺着这个线索,最终在一篇博客里面找到了原生安卓的方法,getBSSID()这个函数就能得到mac地址,于是这个难题最终解决。

代码

loadWifiInfo(){

          let MainActivity = plus.android.runtimeMainActivity();
          // 上下文  
          let Context = plus.android.importClass('android.content.Context');  
          // 导入WIFI管理 和 WIFI 信息 的class  
          plus.android.importClass("android.net.wifi.WifiManager");
          plus.android.importClass("android.net.wifi.WifiInfo");
          plus.android.importClass("android.net.wifi.ScanResult");  
          plus.android.importClass("java.util.ArrayList");  
          // 获取 WIFI 管理实例  
          let wifiManager = MainActivity.getSystemService(Context.WIFI_SERVICE);  
          wifiManager.setWifiEnabled(true);//打开wifi,false为关闭  
          // 获取当前连接WIFI的信息
          let info = wifiManager.getConnectionInfo()
          //查看已经连接上的WIFI信息,在Android的SDK中为我们提供了一个叫做WifiInfo的对象,这个对象可以通过WifiManager.getConnectionInfo()来获取。WifiInfo中包含了当前连接中的相关信息。
          //getBSSID()  获取BSSID属性
          //getDetailedStateOf()  获取客户端的连通性
          //getHiddenSSID()  获取SSID 是否被隐藏
          //getIpAddress()  获取IP 地址
          //getLinkSpeed()  获取连接的速度
          //getMacAddress()  获取Mac 地址
          //getRssi()  获取802.11n 网络的信号
          //getSSID()  获取SSID
          //getSupplicanState()  获取具体客户端状态的信息
          // 获取当前 WIFI 连接的 SSID (WIFI 名称)
          // let ssid = info.getSSID()
          let mac = info.getBSSID()
          if(this.attendanceInformationObj.clockManage.wifi.length>0){
                  let stateIndex = this.attendanceInformationObj.clockManage.wifi.findIndex(ites=>ites.mac===mac)
                  if(stateIndex!==-1){
                        this.clockState = true
                  }
          }
},