android开发中Wifi功能总结

本文总结了Android开发中关于Wifi的使用,包括权限管理、开关控制、状态监听、扫描结果获取、连接/断开操作,以及在室内定位项目中的应用。详细介绍了关键类和方法,并提醒开发者注意耗电和性能优化问题。
摘要由CSDN通过智能技术生成

写在前面

距离上次写博客还是在几个月以前了,最近几个月实在是太忙了,跑去做课设和ios开发,短暂地告别了Android,直到最近在某院实习做毕业设计时需要用到Android系统进行室内定位开发,本文主要是将在项目开发的过程中遇到的关于wifi开发的问题记录下来,方便大家整理。
#情景提要
Android开发过程中,应该说Wifi是很重要的一个功能,在产品中,可能需要随时监听网络状况的变化等等,最近的项目是做室内定位,需要采集各种Wifi的信号和其距离,算出一个大概的范围再结合其他的技术手段进行信息融合得到精确的定位数据,其实个人对wifi一次定位是不抱太大希望的,因为wifi信号的衰减和硬件、环境、空间等等随机因素有关,是及其不准确的,但是项目既然有这个内容,也应当仔细地去研究研究,之前看过网上很多资料,发现大家只是单纯地谈API,对新手很不友好,因此我也想换一个角度来描述一下android Wifi开发,首先我总结以下几个问题:

  • wifi的权限管理
  • 如何开关设备的wifi功能
  • 监听设备wifi状态的改变
  • 获取扫描wifi结果
  • 如何连接/断开一个wifi
  • 在项目中的特殊用法

我个人认为解决以上几点问题就足够了,当然,最后一个在项目中的特殊用法是一个相对“反人类“的用法,感兴趣的可以看看。


wifi的权限管理

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

非隐私权限,因此不用考虑6.0的动态权限管理,直接申明就好,当然这里有一个坑,也是很多人不理解容易遗漏的:获取wifi需要定位权限。为什么需要定位权限呢?其实很好理解的,wifi其实也是一种定位手段,大家可能有用假药或者高德地图,wifi开启能够提高定位的准确性,具体细节我觉得大家不用深究,毕竟不是做通信的,只需要知道下面的重点就好:

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

动态权限申请过程,略。

基础说明

在此说明,面向对象的五(六)大基本原则(S.O.L.I.D)第一条就是单一职责,因此最好是在代码中wifi功能体现到一个类之中并且使用单例模式(饿汉)获取它的实例,比如我就用的MyWifiManager类。然后,大家先看一下我认为在wifi功能开发中最为重要的(3+1)个类:

WIFI开发所关心的三个类和功能描述:

类名 功能
WifiManager wifi统一管理类,进行各种wifi操作
WifiInfo 描述当前连接的wifi热点信息
WifiConfiguration wifi网络配置信息

除此之外还有一个类:

类名 功能
ScanResult 描述扫描出的wifi热点的信息

以上的(3+1)个类是关乎各种wifi操作的最为重要的类,还有以下四个专业术语再帮助大家巩

  • 41
    点赞
  • 155
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
Android开发Wifi是一个非常重要的功能。我们可以通过Wifi连接到互联网,也可以用它来进行文件传输。在本篇文章,我们将介绍如何基于Android自定义Wifi列表。 1. 权限声明 首先,在项目的AndroidManifest.xml文件声明以下权限: ``` <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_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> ``` 这些权限是访问Wifi状态、改变Wifi状态、访问网络状态、访问粗略位置和访问精确位置所必须的。 2. Wifi管理器 接下来,我们需要用到WifiManager类来管理Wifi连接。我们可以通过以下代码获取WifiManager实例: ``` WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE); ``` 3. 扫描附近的Wifi网络 我们可以使用WifiManager的startScan()方法扫描周围的Wifi网络。扫描完成后,我们可以通过getScanResults()方法获取到扫描结果: ``` wifiManager.startScan(); List<ScanResult> scanResults = wifiManager.getScanResults(); ``` 4. 显示Wifi列表 我们可以使用ListView控件来显示Wifi列表,然后使用适配器来将扫描结果填充到ListView。以下是一个简单的适配器示例: ``` public class WifiListAdapter extends BaseAdapter { private List<ScanResult> mScanResults; private LayoutInflater mLayoutInflater; public WifiListAdapter(Context context, List<ScanResult> scanResults) { mScanResults = scanResults; mLayoutInflater = LayoutInflater.from(context); } @Override public int getCount() { return mScanResults.size(); } @Override public Object getItem(int position) { return mScanResults.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; if (convertView == null) { convertView = mLayoutInflater.inflate(R.layout.item_wifi_list, null); viewHolder = new ViewHolder(); viewHolder.ssidTextView = convertView.findViewById(R.id.tv_wifi_ssid); viewHolder.bssidTextView = convertView.findViewById(R.id.tv_wifi_bssid); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } ScanResult scanResult = mScanResults.get(position); viewHolder.ssidTextView.setText(scanResult.SSID); viewHolder.bssidTextView.setText(scanResult.BSSID); return convertView; } static class ViewHolder { TextView ssidTextView; TextView bssidTextView; } } ``` 我们可以在布局文件添加ListView控件,并将其适配器设置为我们创建的WifiListAdapter。然后,我们就可以在ListView显示Wifi列表了。 5. 连接Wifi网络 最后,我们可以使用WifiManager的connect()方法来连接Wifi网络。以下是一个简单的连接示例: ``` WifiConfiguration wifiConfiguration = new WifiConfiguration(); wifiConfiguration.SSID = "\"" + ssid + "\""; wifiConfiguration.preSharedKey = "\"" + password + "\""; wifiConfiguration.status = WifiConfiguration.Status.ENABLED; wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); int networkId = wifiManager.addNetwork(wifiConfiguration); wifiManager.disconnect(); wifiManager.enableNetwork(networkId, true); wifiManager.reconnect(); ``` 在上述代码,我们首先创建一个WifiConfiguration对象,并将SSID和密码设置为我们想要连接的Wifi网络的信息。然后,我们使用addNetwork()方法将WifiConfiguration添加到WifiManager。最后,我们使用disconnect()方法断开当前连接,enableNetwork()方法来启用指定的网络,reconnect()方法来重新连接Wifi网络。 总结 通过以上步骤,我们就可以自定义Android Wifi列表了。我们可以扫描附近的Wifi网络,并将其显示在ListView。我们还可以使用WifiManager来连接Wifi网络。希望这篇文章能够帮助你更好地理解AndroidWifi功能
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值