Android 开发 正常WiFi功能开发 与 WiFi热点开发详解

本文详细介绍了在Android 9.0(Pie)中进行WiFi功能和热点开发的步骤,包括初始化WiFi管理、判断WiFi状态、开启/关闭WiFi、连接指定WiFi、更新WiFi密码、移除WiFi、获取连接信息等。同时,提到了Android 10中API的变化以及WiFi开发中需要注意的广播监听。此外,还提供了一个封装好的WifiHelp类方便使用。
摘要由CSDN通过智能技术生成

前言

  此篇博客讲解WiFi正常功能开发与热点功能开发,但是请注意,这里的API版本是28,Android9.0。 因为Android10 wifi的调用完全不一样了。

  转载请注明来源:https://www.cnblogs.com/guanxinjing/p/9708586.html

权限

不管是WiFi正常功能还是WiFi热点都需要以下权限,Android5.0还需要动态权限

   <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" />

WiFi正常功能开发

初始化WiFi管理

操作WiFi的基础类,所有的WiFi操作都需要使用这个管理类

WifiManager mWifiManager = (WifiManager)getApplicationContext().getSystemService(Context.WIFI_SERVICE);

判断WiFi状态

这个是判断设备的WiFi硬件状态,一共有已经几种设备状态:

WIFI_STATE_DISABLED    WiFi已经禁用WIFI_STATE_DISABLING     正在禁用WiFi中WIFI_STATE_ENABLED     WiFi已经启用WIFI_STATE_ENABLING      正在启用WiFi中WIFI_STATE_UNKNOWN      设备状态未知(或者没有WiFi硬件支持)

    if (mWifiManager.getWifiState() == WifiManager.WIFI_STATE_DISABLED){
        Log.e(TAG, "WiFi已经启用");
    }

判断WiFi是否开启

这是官方提供的更快捷判断WiFi是否开启的方法

    if (mWifiManager.isWifiEnabled()){
        Log.e(TAG, "WiFi已经开启");
    }else {
        Log.e(TAG, "WiFi已经关闭");
    }

开启或者关闭WiFi

用此方法开启WiFi会有一个系统弹窗提示用户手动开启WiFi.

mWifiManager.setWifiEnabled(true); //false为关闭

搜索WiFi与获取WiFi设备列表

    /**
     * 搜索WiFi
     */
    fun scan() {
        mWifiManager.isScanAlwaysAvailable
        mWifiManager.startScan()
    }

    /**
     * 注册搜索结果监听
     */
    private fun registerReceiver(context: Context) {
        val wiFiChangeReceiver = WiFiChangeReceiver()
        val intentFilter = IntentFilter()
        //搜索Wifi扫描已完成,并且结果可用
        intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)
        context.registerReceiver(wiFiChangeReceiver, intentFilter)
    }

    /**
     * 获取搜索到的设备
     */
    @SuppressLint("MissingPermission")
    private suspend fun getScanDevice()  {
        val list: List<ScanResult> = mWifiManager.scanResults //获取WiFi列表
        for (scanResult in list) {
            Log.e("zh", "getScanDevice: ${scanResult}" )
        }
    }
    
    inner class WiFiChangeReceiver : BroadcastReceiver() {
        override fun onReceive(context: Context, intent: Intent) {
            //搜索完成
            if (intent.action == WifiManager.SCAN_RESULTS_AVAILABLE_ACTION) {
                GlobalScope.launch(Dispatchers.Main) {
                    val list = withContext(Dispatchers.IO) { getScanDevice() }
                }
            }
        }
    }

搜索是一个异步的过程,你可以依靠广播回调获取WiFi数据, 也可以立即获取WiFi数据,但是立即获取可能是旧的WiFi数据。

注意一! mWifiManager.getScanResults() 得到的List里面的数据其实是一直会变化的! 意思是计算你获取到了这个list,在WiFi的底层代码里依然会修改/增加/删除这个list里的数据

注意二! mWifiManager.getScanResults() 得到的List里面的数据会出现重复/空名/个别值为null的问题,这是正常的.所以WiFi的难点不是连接与搜索,而是清洗数据

ScanResult可以获取的信息

ScanResult是搜索到WiFi列表后获取的单个WiFi信息,里面包含了一些信息需要了解一下(注意,如果你看源码会发现有很多信息是隐藏的无法调用的.那些变量都是系统级别的API才能调用,这里只说明可以看到的信息)

                    CharSequence area = scanResult.venueName;   //WiFi接入点的地点名称
                    int frequency = scanResult.frequency;       //频率
                    long refreshTime = scanResult.timestamp;    //此WiFi最新的刷新时间戳
                    int level = scanResult.level;               //信号强度
                    String encryption = scanResult.capabilities;//加密方式 例如:WEP/WAP/WAP2
                    String address = scanResult.BSSID;          //WiFi的地址
                    String name = scanResult.SSID;              //WiFi的名称

连接指定的WIiFi网络(API28)

请注意!此代码在Android10 API29的版本上已经无法使用 在新的API 29的SDK中 enableNetwork() 方法始终会返回

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值