Android Wi-Fi基本操作

简介: Android Wi-Fi基本操作

从用户角度看,Android Wi-Fi模块自下向上可以看为5层:硬件驱动程序,wpa_suppplicant,JNI,WiFi API,WifiSettings应用程序。


1.wpa_supplicant是一个开源库,是android实现Wi-Fi功能的基础,它从上层接到命令后,通过Socket与硬件驱动进行通讯,操作硬件完成需要的操作。


2.JNI(Java Native Interface)实现了java代码与其他代码的交互,使得在java虚拟机中运行的java代码能够与其他语言编写的应用程序和库进行交互,在android中,JNI可以让java程序调用C程序。


3.Wi-Fi API使应用程序可以使用Wi-Fi的功能。


4.Wi-FI Settings应用程序是android中自带的一个应用程序,选择手机的Settings->WireLess & netWorks->Wi-Fi,可以让用户手动打开或关闭Wi-Fi功能。当用户打开Wi-Fi功能后,它会自动搜索周围的无线网络,并以列表的形式显示,供用户选择。默认会连接用户上一次成功连接的无线网络。


在android.net.wifi包中提供了一些类管理设备的Wi-Fi功能。主要包括ScanResult,wifiConfiguration,WifiInfo,WifiManager.


1.ScanResult


ScanResult主要是通过Wi-Fi硬件的扫描来获取一些周边的Wi-Fi热点的信息。该类包括以下五个域:

返回类型 域名

解释

public String  BSSID

接入点地址

public String

SSID

网络的名称

public String capabilities

网络性能,包括介入点支持的认证,密钥管理,加密机制等

public int  frequency

以MHz为单位的接入频率

public int level

以dBm为单位的信号强度


该类还提供了一个方法toString(),可将结果转换为简洁,易读的字符串形式。


2.wifiConfiguration类


通过该类可获取一个Wi-Fi网络的网络配置,包括安全配置等。该类包括六个子类,如下:

子类

解释
WifiConfiguration.AuthAlgorthm 获取IEEE802.11的加密方法
WifiConfiguration.GroupCipher 获取组密钥
WifiConfiguration.KeyMgmt 获取密码管理机制
WifiConfiguration.PairwiseCipher 获取WPA方式的成对密钥
WifiConfiguration.Protocol 获取机密协议
WifiConfiguration.Status 获取当前网络状态


每个子类都以常量形式给出相关的配置信息,有些还包括含域和方法。


3.WifiInfo类


通过该类可以获取已经建立或处于活动状态的Wi-Fi网络的状态信息。该类提供的方法较多,部分常用的如下:

方法

解释
getBSSIS() 获取当前接入点的BSSID
getIpAddress() 获取IP地址
getLinkSpeed() 获取当前连接的速度
getMacAddress() 获取MAC地址
getRssi() 获得802.11n网络的信号强度指示
getSSID() 获得网络SSID
getSupplicanState() 返回客户端状态的信息

4.wifiManager类


该类用于管理Wi-Fi连接,其定义了26个常量和23个方法。下面列出常用方法:

方法 

解释
addNetwork(WifiConfiguration  config)

向设置好的网络里添加新网络

calculateSignalLevel(int rssi,int numLevels)

计算信号的等级

compareSignalLevel(int rssiA,int rssiB)

对比两个信号的强度

createWifiLock(int lockType,String tag)

创建一个Wi-Fi锁,锁定当前的Wi-Fi连接

disableNetWork(int netId)

让一个网络连接失败

disconnect()

与当前接入点断连接

enableNetwork(int netId,Boolean disableOthers) 与之前设置好的网络建立连接
getConfiguredNetworks() 客户端获取网络连接状态
getConnectionInfo() 获取当前连接信息
getDhcpInfo() 获取DHCP信息
getScanResult() 获取扫描测试结果
getWifiState() 获取一个Wi-Fi接入点是否有效
isWifiEnabled() 判断一个Wi-Fi连接是否有效
pingSupplicant() 看看客户后台程序是否响应请求
ressociate() 重连到接入点,即使已经连接上了
reconnect() 如果现在没有连接的话,则重连接
removeNetwork(int netId) 移出某一个特定网络
saveConfiguration() 保留一个配置信息
setWifiEnabled(boolean enabled) 让一个连接有效或失效
startScan() 开始扫描
updateNetwork(WifiConfiguration config) 更新一个网络连接信息


需要指出的是,Wi-Fi网卡状态是由一系列的整型常量来表示的。


WIFI_STATE_DISABLED:Wi-Fi网卡不可用,用整型常量1表示。


WIFI_STATE_DISABLING:Wi-Fi网卡正在关闭,用整型常量0表示。


WIFI_STATE_ENABLED:Wi-Fi网卡可用,用整型常量3表示。


WIFI_STATE_ENABLING:Wi-Fi网卡正在打开,启动需要一段时间,用整型常量2表示。


WIFI_STATE_UNKNOWN:未知网卡状态,用整型常量4表示。


此外wifiManager还提供了一个子类wifiManagerLock.wifiManagerLock的作用是这样的:在普通的状态下,如果Wi-Fi的状态处于闲置,那么网络将会暂时中断;但是如果把当前的网络状态锁上,那么Wi-Fi连通将会保持在一定的状态,在结束锁定之后,才会恢复常态。


下面简单介绍一些方法的调用方式

private WifiInfo mWifiInfo;
private WifiManager mWifiManager;


1.获取WifiManager系统服务

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


2.重新获取当前Wi-Fi的连接信息

public void againGetWifiInfo(){
  mWifiInfo=mWifiManager.getConnectionInfo();
}


3.判断用户是否开启wi-fi网卡

public boolean isNetCardFriendly(){
  return mWifiManager.isWifiEnabled();
}

4.判断当前是否连接Wi-Fi

private State state;
//创建连接管理器
private ConnectivityManager connManager;
public boolean isConnectioning(){
  state=connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();
  if(State.CONNECTING==state){
    return true;
  }else{
    return false;
  }
}


5.得到当前网络的连接状态

public State getCurrentState(){
  state=connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();
  return state;
}


6.设置配置好的网络(有密码的网络并配置好密码),指定的


//网络连接列表
private List<WifiConfiguration> wifiConfigList=new ArrayList<WifiConfiguration>();
//Wi-Fi配置列表
private List<WifiConfiguration> wifiConfigedSpecifiedList=new ArrayList<WifiConfiguration>();
public void setWifiConfigedSpecifiedList(String ssid){
  wifiConfigedSpecifiedList.clear();
  if(wifiConfigList!=null){
    for(WifiConfiguration item : wifiConfigList){
      //如果是指定的网络,就加入列表
      if(item.SSID.equalsIgnoreCase("\""+ssid+"\"")&& item.preSharedKey!=null){
        //添加到列表中
        wifiConfigedSpecifiedList.add(item);
      }
    }
  }
}


7.返回Wi-Fi设置列表

public List<WifiConfiguration> getWifiConfigedSpecifiedList(){
  return wifiConfigedSpecifiedList;
}



8.打开Wi-Fi网卡

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


9.关闭Wi-Fi网卡

public void closeNetCard(){
  if(mWifiManager.isWifiEnabled()){
    mWifiManager.setWifiEnabled(false);
  }
}


10.检查当前Wi-Fi网卡状态

public void checkNetCardState(){
  if(mWifiManager.getWifiState()==0){
    Log.i("","网卡正在关闭");
  }else if(mWifiManager.getWifiState()==1){
    Log.i("","网卡已经关闭");
  }else if(mWifiManager.getWifiState()==2){
    Log.i("","网卡正在打开");
  }else if(mWifiManager.getWifiState()==3){
    Log.i("","网卡已经打开");  
  }else{
    Log.i("","没有获取到状态");
  }
}

11.扫描周边网络


//保存扫描结果列表
public List<ScanResult> listResult=new ArrayList<ScanResult>();
public void scan(){
  //开始扫描
  mWifiManager.startScan();
  //获取扫描结果
  listResult=mWifiManager.getScanResults();
  //扫描配置列表
  wifiConfigList=mWifiManager.getConfiguredNetworks();
  if(listResult!=null){
    //当前存在无线网络
  }else{
    //当前区域没有无线网络  
  }
}


12.返回扫描结果


public List<ScanResult> getListResult(){
  return listResult;
}

13.得到扫描结果

//存储扫描结果
private StringBuffer mStringBuffer=new StringBuffer();
private ScanResult mScanResult;
public String getScanResult(){
  //每次点击扫描之前清空上一次扫描结果
  if(mStringBuffer!=null){
    mStringBuffer=new StringBuffer();  
  }
  //开始扫描调用11的方法
  scan();
  listResult=mWifiManager.getScanResults();
  if(listResult!=null){
    for(int i=0;i<listResult.size();i++){
      mScanResult=listResult.get(i);
      //将需要的属性连接到字符串里面 
     mStringBuffer.append("NO.").append(i+1).append(" :").append(mScanResult.SSID).append("->").append(mScanResult.BSSID).append("->").append(mScanResult.capabilities).append("->").append(mScanResult.frequency).append("->").append(mScanResult.level).append("->").append(mScanResult.describeContents()).append("\n\n");
    }
  }
  return mStringBuffer.toString();
}

14.断开当前连接的网络

public void disconnectWifi(){
  //获取网络ID
  int newId=getNetworkId();
  //设置网络不可用
  mWifiManager.disableNetWork(netId);
  //断开网络
  mWifiManager.disconnect();
  //设置Wi-Fi信息为NULL
  mWifiInfo=null;
}


15.检查当前网络状态

public Boolean checkNetWorkState(){
  if(mWifiInfo!=null){
    return true;
  }else{
    return false;
  }
}


16.得到连接的ID

public int getNetworkId(){
  return (mWifiInfo==null)?0:mWifiInfo.getNetworkId();
}


17.得到IP地址

public void getIPAddress(){
   return (mWifiInfo==null)?0:mWifiInfo.getIpAddress();
}


18.锁定WifiLock

WinfiLock mWifiLock;
public void acquireWifilock(){
  mWifiLock.acquire();
}


19.解锁WifiLock

public void releaseWifiLock(){
  if(mWifiLock.isHeld()){
    mWifiLock.acquire();
  }
}


20.创建一个WifiLock

public void creatWifiLock(){
  mWifiLock=mWifiManager.createWifiLock("test");
}


21.得到配置好的网络wpa_supplicant.conf中的内容,不管有没有配置密码

public List<WifiConfiguration> getConfiguration(){
  return wifiConfigList;
}


22.指定配置好的网络连接

public Boolean connectConfiguration(int index)(){
  //所引大于配置好的网络返回
  if(index>=wifiConfigList.size()){
    return false;
  }
  return mWifiManager.enableNetwork(wifiConfigedSpecifiedList.get(index).networkId,true);
}


23.得到MAX地址

public String getMacAddress(){
  return (mWifiInfo=null)?"":mWifiInfo.getMacAddress(); 
}


24.得到接入点BSSID

public String getBSSID(){
  return (mWifiInfo=null)?"NULL":mWifiInfo.getBSSID();
}



25.得到WifiInfo的所有信息包

public String getWifiInfo(){
  return (mWifiInfo=null)?"NULL":mWifiInfo.toString();
}


26.添加一个网络并连接

public int addNetwork(WifiConfiguration g){
  //添加网络
  int wcgID=mWifiManager.addNetwork(g);
  //设置添加的网络可用
  mWifiManager.enableNetwork(wcgID,true);
  return wcgID;
}
相关文章
|
2月前
|
Android开发 UED Kotlin
Android中如何跳转到Wi-Fi开关设置页
本文介绍如何在Android应用开发中使用隐式Intent引导用户至特定系统设置页面,如Wi-Fi设置页,并提供Kotlin代码示例。通过设置Intent的Action属性并检查设备兼容性,可轻松实现跳转功能,提升用户体验。此外,还列举了其他常用设置页面的Intent Action及注意事项。
73 15
|
5月前
|
安全 Java API
Android获取Wi-Fi网络列表
【6月更文挑战第21天】
|
安全 Android开发 数据安全/隐私保护
|
2天前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
3天前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异和挑战
【10月更文挑战第37天】在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统扮演着主角。它们各自拥有独特的特性、优势以及面临的开发挑战。本文将深入探讨这两个平台在开发过程中的主要差异,从编程语言到用户界面设计,再到市场分布的不同影响,旨在为开发者提供一个全面的视角,帮助他们更好地理解并应对在不同平台上进行应用开发时可能遇到的难题和机遇。
|
5天前
|
XML 存储 Java
探索安卓开发之旅:从新手到专家
【10月更文挑战第35天】在数字化时代,安卓应用的开发成为了一个热门话题。本文旨在通过浅显易懂的语言,带领初学者了解安卓开发的基础知识,同时为有一定经验的开发者提供进阶技巧。我们将一起探讨如何从零开始构建第一个安卓应用,并逐步深入到性能优化和高级功能的实现。无论你是编程新手还是希望提升技能的开发者,这篇文章都将为你提供有价值的指导和灵感。
|
3天前
|
存储 API 开发工具
探索安卓开发:从基础到进阶
【10月更文挑战第37天】在这篇文章中,我们将一起探索安卓开发的奥秘。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和建议。我们将从安卓开发的基础开始,逐步深入到更复杂的主题,如自定义组件、性能优化等。最后,我们将通过一个代码示例来展示如何实现一个简单的安卓应用。让我们一起开始吧!
|
4天前
|
存储 XML JSON
探索安卓开发:从新手到专家的旅程
【10月更文挑战第36天】在这篇文章中,我们将一起踏上一段激动人心的旅程,从零基础开始,逐步深入安卓开发的奥秘。无论你是编程新手,还是希望扩展技能的老手,这里都有适合你的知识宝藏等待发掘。通过实际的代码示例和深入浅出的解释,我们将解锁安卓开发的关键技能,让你能够构建自己的应用程序,甚至贡献于开源社区。准备好了吗?让我们开始吧!
15 2
|
5天前
|
Android开发
布谷语音软件开发:android端语音软件搭建开发教程
语音软件搭建android端语音软件开发教程!
|
13天前
|
编解码 Java Android开发
通义灵码:在安卓开发中提升工作效率的真实应用案例
本文介绍了通义灵码在安卓开发中的应用。作为一名97年的聋人开发者,我在2024年Google Gemma竞赛中获得了冠军,拿下了很多项目竞赛奖励,通义灵码成为我的得力助手。文章详细展示了如何安装通义灵码插件,并通过多个实例说明其在适配国际语言、多种分辨率、业务逻辑开发和编程语言转换等方面的应用,显著提高了开发效率和准确性。