空祖家的 Wifi 连接封装库,适用于智能硬件 Wifi 连接通讯

WifiLinker

项目地址:kongzue/WifiLinker 

简介: ?空祖家的 Wifi 连接封装库,适用于智能硬件 Wifi 连接通讯

更多:作者   提 Bug   

标签:

 

Wifi 连接封装库,适用于智能硬件 Wifi 通讯。

   

Demo 下载:https://fir.im/WifiLinker

前言

本库主要是针对 Wifi 连接过程的封装

使用方法

1) 从 Maven 仓库或 jCenter 引入: Maven 仓库:

<dependency>
  <groupId>com.kongzue.smart</groupId>
  <artifactId>wifilinker</artifactId>
  <version>1.0.4</version>
  <type>pom</type>
</dependency>

Gradle: 在 dependencies{}中添加引用:

implementation 'com.kongzue.smart:wifilinker:1.0.4'

关于权限

您需要申请蓝牙权限后才可以正常使用

主要权限:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

需要申请:

Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION

若不声明或申请权限,可能导致无法查找到要连接的目标设备,或无法正常使用功能。

在最新版本的 MIUI 中,因小米私加 WIFI 开关权限导致使用过程中可能出现不停弹出“是否允许程序开关 WIFI”的提示框,而该权限属于私有权限未找到申请方法,请进入软件设置界面手动开启权限:

 

另外请注意,已知在部分设备上,OnWifiConnectStatusChangeListener.onConnect 中返回的已连接 WifiInfo 中 SSID 值为“unknow ssid”系系统策略,并非本库的问题。

开始使用

创建 wifiUtil 对象:

wifiUtil = new WifiUtil(this);

查找

1) 查找附近 Wifi(不推荐,部分国产系统对此功能做了限制,建议参考《连接》章节的“对于已知类型的 Wifi 的连接方式”)

wifiUtil.scan(new OnWifiScanListener() {
    @Override
    public void onScan(List<ScanResult> result) {
        //自行处理 result
    }
});

2) 停止查找

wifiUtil.stopScan();

连接

对于未知类型的 Wifi,需要先进行查找附近的 Wifi,然后执行:

wifiUtil.link(ssid, password, new OnWifiConnectStatusChangeListener() {
    @Override
    public void onStatusChange(boolean isSuccess, int statusCode) {
        //根据 statusCode 判断连接状态
        switch (statusCode){
                    case ERROR_DEVICE_NOT_HAVE_WIFI:
                        txtLog.setText("错误:设备无 Wifi");
                        break;
                    case ERROR_CONNECT:
                        txtLog.setText("错误:连接失败");
                        break;
                    case ERROR_CONNECT_SYS_EXISTS_SAME_CONFIG:
                        txtLog.setText("错误:设备已存在相同 Wifi 配置");
                        break;
                    case ERROR_PASSWORD:
                        txtLog.setText("错误:密码错误");
                        break;
                    case CONNECT_FINISH:
                        txtLog.setText("已连接");
                        break;
                    case DISCONNECTED:
                        txtLog.setText("已断开连接");
                        break;
                }
    }
    @Override
    public void onConnect(WifiInfo wifiInfo) {
        //连接完成后获取 Wifi 信息

    }
});

对于已知类型的 Wifi,使用以下连接方式:

wifiUtil.link(ssid, password, WifiAutoConnectManager.WifiCipherType.WIFICIPHER_WPA,
        new OnWifiConnectStatusChangeListener() {
            @Override
            public void onStatusChange(boolean isSuccess, int statusCode) {
                switch (statusCode){
                    case ERROR_DEVICE_NOT_HAVE_WIFI:
                        txtLog.setText("错误:设备无 Wifi");
                        break;
                    case ERROR_CONNECT:
                        txtLog.setText("错误:连接失败");
                        break;
                    case ERROR_CONNECT_SYS_EXISTS_SAME_CONFIG:
                        txtLog.setText("错误:设备已存在相同 Wifi 配置");
                        break;
                    case ERROR_PASSWORD:
                        txtLog.setText("错误:密码错误");
                        break;
                    case CONNECT_FINISH:
                        txtLog.setText("已连接");
                        break;
                    case DISCONNECTED:
                        txtLog.setText("已断开连接");
                        break;
                }
            }
            @Override
            public void onConnect(WifiInfo wifiInfo) {
                //连接完成后获取 Wifi 信息
            }
        }
);

返回值中,isSuccess 代表是否成功连接,statusCode 表示了所处的状态,状态值对应含义如下:

ERROR_DEVICE_NOT_HAVE_WIFI = -1;    //设备无 Wifi 模块
ERROR_CONNECT = -2;                 //连接失败
ERROR_CONNECT_SYS_EXISTS_SAME_CONFIG = -3;                 //连接失败:系统已存在相同 Wifi 配置(需手动删除已存储连接)
ERROR_PASSWORD = -11;               //密码错误
CONNECT_START = 1;                  //开始连接
CONNECT_FINISH = 2;                 //已连接
DISCONNECTED = 3;                   //已断开连接

额外方法:

//断开连接
wifiUtil.disconnect();

需要注意

请在 Activity 退出时执行 close() 方法:

@Override
protected void onDestroy() {
    wifiUtil.close();
    super.onDestroy();
}

⚠ 警告!请勿以 statusCode 状态为主进行判断,因为这个吃的是系统广播回调,不准,要知道连不连成功的判断方法是检查 onConnect 有没有执行。

另外我们注意到某些设备在附近没有要连接的 Wifi 的情况下,会主动重新连接之前连接的 Wifi,此时也会走 CONNECT_FINISH 回调,同时 onConnect 也会执行,这种问题的解决方法是判断:

@Override
public void onConnect(WifiInfo wifiInfo) {
    //连接完成后获取 Wifi 信息
    if (wifiInfo.getName().contains(你连接的 Wifi 的 SSID)){      //用 contains 方法判断的原因是 wifiInfo.getName()可能是加了引号的 WifiSSID
        //差不多是真的连接成功了
    }
}

因部分设备限制,wifiInfo.getName() 获取的值可能是 “unknow ssid”这个问题已经在新版本中解决了,方案是通过 networkId 去已存储的 Wifi 信息列表中找到对应的 Wifi 信息获取其 SSID 是正确的 SSID。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值