Android/安卓开发之WIFI的基本应用

本文详细介绍了如何在Android中进行WIFI的基本操作,包括打开/关闭WIFI、扫描WiFi网络、连接不同加密方式的WiFi、监听连接状态以及开启热点。通过创建一个WiFi管理类,简化了在Activity中的调用流程,并提供了完整的代码示例,涵盖从初始化到连接的全过程,同时提到了可能遇到的问题和注意事项。最后,分享了一个GitHub上的完整demo链接供参考。

本文没有涉及到连接WIFI之后进行通讯,若有这方面的想法(例如两个客户端连接至同一WIFI后进行通讯),请关注后续文章一起讨论。

其实关于WIFI的开发的文章也非常的多,但是大部分只是简单的例子,不够全面,我这里是想写一个比较完整的WIFI应用,主要功能:

1.能够打开/关闭WIFI

2.能够扫面wifi并获取扫描结果

3.能够连接wifi,无论是什么加密方式

4.能够监听连接状态,如正在连接、正在获取ip、密码错误等

5.能够锁定wifi

6.能获取wifi的加密方式

7.开启热点

8.等等,大部分wifi操作常用的功能...

至于开发中用的几个相关类我就不做过多介绍了,网上比比皆是,还不了解的可以先看一下其他博客的介绍或者官方文档。

我尽量在代码中增加了一些注释,还是那句话:我还是个安卓小白,错误在所难免,如果有错误,希望大家多多指点。

 

一般使用WIFI流程:

1.打开wifi

1.1 状态监听

2.扫描wifi

3.连接wifi

4.关闭wifi

其中连接需要分几种情况:

1.如果是之前已经保存,直接连接

2.如果没有保存,必须先进行配置,再连接

2.1配置需要区分三种加密方式:无密码、WEP、WPA

3.WPS连接

 

那么就来打造一个简单demo,按照以上的步骤来。

 

开发流程

我们为了以后使用方便,直接编写一个wifi管理类,然后在activity直接调用对应方法就行了。下面着手进行这个类的编写:

0.在开始开发之前我们需要先配置相应的权限,如果是Android 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.INTERNET" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <!-- 在android N 以上 需要添加位置权限 -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

然后先看看我们需要准备什么全局变量

 

 

 private WifiManager mWifiManager;//wifi管理器
    private List<ScanResult> mScanResults;//扫描结果
    private Context mContext;
    private WifiStateReceiver mReceiver;//广播接收器
    private WifiStateChangeListener mWifiStateChangeListener;//
    private WifiManager.WifiLock mWifiLock;//WIFI锁
    private static WiFiAdmin mWifiAdmin;//单利模式,

 


1.第一步,初始化wifi管理器并打开wifi

 

 

初始化

 

/***
     * 构造方法  - - 由于使用单例,所以设为私有
     * @param context
     */
    private WiFiAdmin(Context context) {
        mContext = context;
        //如果使用activity的context则不能访问存储空间,在版本大于Android N时,因此使用全局的Context
        mWifiManager = (WifiManager) mContext.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
        mWifiLock = mWifiManager.createWifiLock("mlock");
    }

打开wifi

 

 

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


2.注册广播,接收wifi的一些状态,例如正在连接、正在获取ip地址、断开连接等

 

 

 private void registerWifiRecv() {
        //注册广播
        mReceiver = new WifiStateReceiver();
        IntentFilter mFilter = new IntentFilter();
        mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION); //信号强度变化
        mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); //网络状态变化
        mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION); //wifi状态,是否连上,密码
        mFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION); //是不是正在获得IP地址
        mFilter.addAction(WifiManager.NETWORK_IDS_CHANGED_ACTION);
        mFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
        mContext.registerReceiver(mReceiver, mFilter);
        isRegisterRecv = true;
    }


3.既然注册了广播,那么我们肯定要处理对应结果

 

 

 class WifiStateReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (!isRegisterRecv) return;//没注册监听就没必要执行之后的逻辑
            String action = intent.getAction();
            switch (action) {
                case WifiManager.RSSI_CHANGED_ACTION:
                    //信号强度变化
                    mWifiStateChangeListener.onSignalStrengthChanged(getStrength(context));
                    break;
                case WifiManager.NETWORK_STATE_CHANGED_ACTION:
                    NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
                    if (info.getDetailedState().equals(NetworkInfo.DetailedState.DISCONNECTED)) {
                        //wifi已断开
                        mWifiStateChangeListener.onWifiDisconnect();
                    } else if (info.getDetailedState().equals(NetworkInfo.DetailedState.CONNECTING)) {
                        //正在连接...
                        mWifiStateChangeListener.onWifiConnecting();
                    } else if (info.getDetailedState().equals(NetworkInfo.DetailedState.CONNECTED)) {
                        //连接到网络
                        mWifiStateChangeListener.onWifiConnected();
                    }else if(info.getDetailedState().equals(NetworkInfo.DetailedState.OBTAINING_IPADDR)){
                        //正在获取IP地址
                        mWifiStateChangeListener.onWifiGettingIP();
                    }else if(info.getDetailedState().equals(NetworkInfo.DetailedState.FAILED)){
                        //连接失败
                    }

                    break;
                case WifiManager.WIFI_STATE_CHANGED_ACTION:
                    int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 0);
                    switch (wifiState) {
                        case WifiManager.WIFI_STATE_ENABLING:
                            //wifi正在启用
                            mWifiStateChangeListener.onWifiEnabling();
                            break;
                        case WifiManager.WIFI_STATE_ENABLED:
                            //Wifi已启用
                            mWifiStateChangeListener.onWifiEnable();
                            break;
                    }
                    break;
                case WifiManager.SUPPLICANT_STATE_CHANGED_ACTION:
                    int error = intent.getIntExtra(WifiManager.EXTRA_SUPPLICANT_ERROR, -100);
                    LogUtil.log("密码认证错误:"+error+"\n");
                    if (error==WifiManager.ERROR_AUTHENTICATING){
                        //wifi密码认证错误!
                        mWifiStateChangeListener.onPasswordError();
                    }
                    break;
                case WifiManager.NETWORK_IDS_CHANGED_ACTION:
                    //已经配置的网络的ID可能发生变化时
                    mWifiStateChangeListener.onWifiIDChange();
                    break;
                case ConnectivityManager.CONNECTIVITY_ACTION:
                    //连接状态发生变化,暂时没用到
                    int type = intent.getIntExtra(ConnectivityManager.EXTRA_NETWORK_TYPE,0);
                    break;
                default:
                    break;
            }
        }
    }

    /**
     * 计算信号强度
     *
     * @param context 含有WIFI信息的资源对象
     * @return 信号强度
     */
    private int getStrength(Context context) {
        WifiInfo info = getConnectInfo();
        if (info.getBSSID() != null) {
            int strength = WifiManager.calculateSignalLevel(info.getRssi(), 5);
            // 链接速度
//			int speed = info.getLinkSpeed();
//			// 链接速度单位
//			String units = WifiInfo.LINK_SPEED_UNITS;
//			// Wifi源名称
//			String ssid = info.getSSID();
            return strength;
        }
        return 0;
    }


4.然后发起扫描并获取扫描结果

 

/**
     * 启动扫描,扫描前应使用 {@link #getWifiState()}判断WIFI是否可用
     * 或者在回调函数 mWifiStateChangeListener.onWifiEnable() 调用
     */
    public void startWifiScan() {
        mWifiManager.startScan();
        mScanResults = mWifiManager.getScanResults();
    }


5.获取到扫描结果之后,我们就可以发起连接了。对于之前已经连接过的wifi,可以直接这样:

 

 

 public boolean connectWifi(int netId) {
        return mWifiManager.enableNetwork(netId, true);
    }

那么netid怎么来的?这就需要以下这些操作,首先要获取已经配置过(就是之前连接过的)的wifi

 

 

public WifiInfo getConnectInfo() {
        return mWifiManager.getConnectionInfo();
    }

使用以下方法获取netid,如果返回-1,证明没有配置,需要配置才能发起连接请求。

 

 

 public int isWifiConfig(String ssid) {
        List<WifiConfiguration> lists = getConfigWifiList();
        for (WifiConfiguration c : lists) {
            if (c.SSID.equals("\"" + ssid + "\"")) {
                re
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值