Android中Wi-Fi扫描、连接和信息(一)

本文介绍了Android中Wi-Fi的管理,包括Wi-Fi技术概述、关键类的使用如WifiManager、ScanResult、WifiInfo等,以及在扫描、连接过程中可能遇到的问题和解决方案,如Wi-Fi权限设置和定位需求。同时提供了相关资源链接和测试代码。
摘要由CSDN通过智能技术生成

1.Wi-Fi介绍

Wi-Fi是一种允许电子设备连接到一个无线局域网(WLAN)的技术,通常使用2.4G UHF或5G SHF ISM 射频频段。连接到无线局域网通常是有密码保护的;但也可是开放的,这样就允许任何在WLAN范围内的设备可以连接上。Wi-Fi是一个无线网络通信技术的品牌,由Wi-Fi联盟所持有。目的是改善基于IEEE 802.11标准的无线网路产品之间的互通性。有人把使用IEEE 802.11系列协议的局域网就称为无线保真。甚至把Wi-Fi等同于无线网际网路(Wi-Fi是WLAN的重要组成部分)。

2.Wi-Fi关键类说明

2.1Wi-Fi相关包说明

做过Wi-Fi开发的人应该都熟悉android.net.wifi包;

android.net.wifi包的简介:

提供在设备上管理Wi-Fi功能的类。

Wi-Fi api提供了一种方式,应用程序可以与提供Wi-Fi网络接入的低层无线栈进行通信。几乎所有来自设备请求者的信息都是可用的,包括连接的网络的链路速度、IP地址、协商状态,以及其他可用的其他网络的信息。其他一些API功能包括扫描、添加、保存、终止和启动Wi-Fi连接。

2.2常用关键类说明

2.2.1WifiManager

WifiManager:这个类提供了管理Wi-Fi连接所有操作的主要API。

定义了许多的常量和方法,查看官网SDK了解;

Wi-Fi连接用到的主要状态,用整型值表示,如下:


2.2.2ScanResult

ScanResult:描述探测到的访问点(Wi-Fi)的信息。

ScanResult中关键字段说明:

返回类型 域名 解释
public String BSSID 接入点的地址
public String SSID 网络的名字(在Wi-Fi列表中看的名字)
public String capabilities 网络性能,包括接入点支持的认证、密钥管理、加密机制等
public int frequency 以MHz为单位的接入频率
public int level 以dBm为单位的信号强度。

2.2.3WifiInfo

WifiInfo:描述已经连接或者活动的Wifi连接状态和信息。

调用WifiInfo类中方法代码:

mWifiManager = (WifiManager)getSystemService(Context.WIFI_SERVICE);     
mWifiInfo = mWifiManager.getConnectionInfo();  //获取当前连接Wi-Fi的信息
if(null != mWifiInfo && null != mWifiInfo.getSSID()){  
        String info = "getSSID()="+mWifiInfo.getSSID()+"\n"  
                +"getBSSID()="+mWifiInfo.getBSSID()+"\n"  
                +"getHiddenSSID()="+mWifiInfo.getHiddenSSID()+"\n"  
                +"getLinkSpeed()="+mWifiInfo.getLinkSpeed()+"\n"  
                +"getMacAddress()="+mWifiInfo.getMacAddress()+"\n"  
                +"getNetworkId()="+mWifiInfo.getNetworkId()+"\n"  
                +"getRssi()="+mWifiInfo.getRssi()+"\n"  
                +"getSupplicantState()="+mWifiInfo.getSupplicantState()+"\n"  
                +"getDetailedStateOf()="+mWifiInfo.getDetailedStateOf(mWifiInfo.getSupplicantState());  
        mTVWifiInfo.setText(info);  
}else {  
        mTVWifiInfo.setText("没有连接到wifi");  

2.2.4WifiConfigration

WifiConfigration:一个表示配置的Wi-Fi网络的类,包括安全配置。

 该类主要包含网络配置和安全配置信息,如下:

子类 解释
WifiConfiguration.AuthAlgorthm 获取IEEE 802.11的加密方法
WifiConfiguration.GroupCipher
获取组密钥
WifiConfiguration.KeyMgmt
获取密码管理体制
WifiConfiguration.PairwiseCipher
获取WPA方式的成对密钥
WifiConfiguration.Protocol
获取加密协议
WifiConfiguration.Status
获取当前网络状态
更多信息可以查看官方文档;

2.2.5使用Wi-Fi用到的权限

ACCESS_WIFI_STATE:允许应用程序获取Wi-Fi连接的状态;
CHANGE_WIFI_STATE:允许应用程序改变Wi-Fi的连接状态;

CHANGE_WIFI_MULTICAST_STATE:允许改变Wi-Fi组播状态;

具体使用,申请Wi-Fi的操作权限:

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

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

这块在6.0及以后版本仅添加这两个权限会发现mWifiManager.getScanResults()返回的是空Wi-Fi列表,没有Wi-Fi信息返回;

3.具体实现测试

3.1管理Wi-Fi的关键代码

package com.dress.gold.interconnected.checkphone.utils;

import android.content.Context;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.util.Log;
import android.widget.Toast;

import com.dress.gold.interconnected.checkphone.zxing.decoding.Intents;

import java.util.ArrayList;
import java.util.List;

/**
 * Wi-Fi常见操作类
 * Wi-Fi状态值:One of WIFI_STATE_DISABLED, WIFI_STATE_DISABLING, WIFI_STATE_ENABLED, WIFI_STATE_ENABLING, WIFI_STATE_UNKNOWN
 */

public class WifiOperator {
    // 定义几种加密方式,一种是WEP,一种是WPA,还有没有密码的情况
    public enum WifiCipherType {
        WIFICIPHER_WEP, WIFICIPHER_WPA, WIFICIPHER_NOPASS, WIFICIPHER_INVALID
    }

    //定义管理Wi-Fi连接所有功能类的对象
    private WifiManager mWifiManager;
    //定义存放Wi-Fi信息的对象
    private WifiInfo mWifiInfo;
    //扫描可以访问的Wi-Fi热点的列表
    private List<ScanResult> mWifiList;
    //各个Wi-Fi热点的网络配置的列表
    private List<WifiConfiguration> mWifiConfigration;
    //定义允许应用程序保持Wi-Fi无线电波保持唤醒状态对象
    private WifiManager.WifiLock mWifiLock;

    //构造器
    public WifiOperator(Context context){
        //获取管理Wi-Fi连接所有功能类的对象
        mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        //返回当前Wi-Fi连接的动态信息,如果有的话。
        mWifiInfo = mWifiManager.getConnectionInfo();
    }

    //打开Wi-Fi
    public void openWifi(Context context){
        //检测打开Wi-Fi功能
        if(!mWifiManager.isWifiEnabled()){
            mWifiManager.setWifiEnabled(true);
        }else if(mWifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLING){
            Toast.makeText(context,"Wi-Fi正在开启中,请勿重复开启", Toast.LENGTH_SHORT).show();
        }else{
            Toast.makeText(context,"Wi-Fi已经开启,请勿重复开启", Toast.LENGTH_SHORT).show();
        }
    }

    //关闭Wi-Fi
    public void closeWifi(Context context){
        //检测关闭Wi-Fi功能
        if(mWifiManager.isWifiEnabled()){
            mWifiManager.setWifiEnabled(false);
        }else if(mWifiManager.getWifiState() == WifiManager.WIFI_STATE_DISABLING){
            Toast.makeText(context,"Wi-Fi正在关闭中,请勿重复关闭", Toast.LENGTH_SHORT).show();
        }else{
            Toast.makeText(context,"Wi-Fi已经关闭,请勿重复关闭", Toast.LENGTH_SHORT).show();
        }
    }

    //检车当前Wi-Fi的状态
    public void checkState(Context context){
        if (mWifiManager.getWifiState() == WifiManager.WIFI_STATE_DISABLING) {
            Toast.makeText(context,"Wifi正在关闭中", Toast.LENGTH_SHORT).show();
        } else if (mWifiManager.getWifiState() == WifiManager.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值