Android系统编程入门系列之硬件交互——无线通信WLAN
Android系统的移动设备大多支持无线WLAN技术。利用该技术,不仅能实现互联网通信,还能实现无线定位,热点共享等远程通信功能。针对使用WLAN的不同功能,可能需要分别申请不同的权限声明,同时调用不同的系统框架API,下文将按照不同的使用功能分别介绍。
扫描无线设备
该功能通常只允许在系统自带的设置应用中使用,当然如果是第三方应用的目标版本在Android 9.0即API 28以下,也可以使用该功能。扫描周围的无线设备,需要用到android.net.wifi.WifiManager wifi管理类。
权限声明
在扫描无线设备时,需要启用设备的位置开关,同时申请Manifest.permission.ACCESS_FINE_LOCATION="android.permission.ACCESS_FINE_LOCATION"
精确定位权限或者Manifest.permission.ACCESS_COARSE_LOCATION="android.permission.ACCESS_COARSE_LOCATION"
模糊定位权限。
另外,由于需要使用设备的WLAN才能扫描,所以需要申请获取设备自身wifi状态的权限Manifest.permission.ACCESS_WIFI_STATE="android.permission.ACCESS_WIFI_STATE"
。
同样扫描也会修改设备自身的wifi状态,所以也需要声明wifi状态修改的权限Manifest.permission.CHANGE_WIFI_STATE="android.permission.CHANGE_WIFI_STATE"
。
扫描流程
首先在可以获取上下文环境Context
对象的位置,调用该对象的getSystemService(String name)
方法,参数 name 值为Context.WIFI_SERVICE="wifi"
,返回WifiManager
wifi管理类对象。
在需要开启扫描的位置,调用WifiManager
对象的startScan()
方法,即可开始扫描,该方法会返回boolean
类型的结果标志是否成功启动扫描。
虽然已经成功启动了扫描无线设备的功能,但是查看扫描结果还需要借助四大组件中负责进程间通信的广播接收器。自定义BroadcastReceiver
的目的就是用于接收扫描结果。因此在调用context.registerReceiver(BroadcastReceiver receiver, IntentFilter intentFilter)
方法注册该广播接收器时,通过IntentFilter
对象设置的意图行为addAction(String action)
传入的参数 action 值为WifiManager.SCAN_RESULTS_AVAILABLE_ACTION="android.net.wifi.SCAN_RESULTS"
。最终,在该类的onReceiver(Context context, Intent intent)
方法中,可以对接收到的参数 intent 意图获取保存的结果,调用该参数的getBooleanExtra(String key, boolean default)
方法,传入参数 key 的值为WifiManager.EXTRA_RESULTS_UPDATED="resultsUpdated"
,即可得到boolean
类型的实际扫描结果。
在得到扫描结果为true
之后,可以继续调用WifiManager
对象的getScanResults()
方法获取扫描结果,得到由android.net.wifi.ScanResult扫描结果类组成的List
数组。
建立网络连接
通过WLAN设备可以建立网络连接,以此与其他WLAN设备通信。建立wifi连接的途径主要有两种,包括连接其他WLAN广播设备,或者与另外一个WLAN设备建立一对一连接(俗称热点连接)。之后的连接状态和通信过程,则都是主要借助android.net.ConnectivityManager连接管理类。获取该连接管理类对象的方法同样是在可以获取上下文环境Context
对象的位置,调用该对象的getSystemService(String name)
方法,参数 name 值为Context.CONNECTIVITY_SERVICE="connectivity"
,返回ConnectivityManager
连接管理类对象。其后流程暂先不表,这里主要介绍如何建立wifi连接。
权限声明
与其他WLAN设备建立网络连接,首先要在清单文件中声明[Manifest.permission.ACCESS_WIFI_STATE](https://developer.android.google.cn/reference/android/Manifest.permission#ACCESS_WIFI_STATE
WLAN广播连接
在Android 10即API 29版本以前,主要依赖WifiManager
管理类对象。而从Android10及API 29版本开始,改由android.net.wifi.WifiNetworkSuggestionwifi网络建议类执行相关操作。
适用于API 29之前版本
通过android.net.wifi.WifiConfiguration的相关变量,配置要连接的WLAN设备信息,包括 SSID 对应的wifi名, preSharedKey对应的wifi密码, allowKeyManagement 对应的加密方式等信息。
在创建并配置WifiConfiguration
对象的相关信息之后,调用WifiManager
对象的addNetwork(WifiConfiguration config)
方法,将上述对象作为参数 config 的值传入,即可得到 int
类型的本地id索引值,如果添加失败,则返回的该索引值将为非正数。成功得到该索引值之后,再次调用WifiManager
对象的enableNetwork(int netId, boolean attemptConnect)
,其参数 netId 即得到的索引值传入,参数 attemptConnect 如果为true
会立即尝试连接,否则只是保存该wifi信息,并不会自动连接。
一旦系统尝试连接,网络连接状态会通过系统广播实时发送,因此如果想在应用程序中实时监听网络连接状态,只需要在获取上下文环境Context
对象的位置,注册一个自定义的BroadcastReceiver
广播接收器。监听的Intent
意图对象中的 action 参数值WifiManager.RSSI_CHANGED_ACTION="android.net.wifi.RSSI_CHANGED"
为连接的WLAN设备RSSI发生改变时的行为标签。另外可以通过意图对象的getBundle()
等系列参数获取网络状态信息,其值均在WifiManager
中以常量形式定义。
适用于API 29及以后版本
通过android.net.wifi.WifiNetworkSuggestion.Builder建造者模式的无参构造方法和setX()
系列方法配置要连接的WLAN设备信息,包括setSsid(String ssid)
对应的wifi名,和setWpa2Passphrase(String passphrase)
对应设置wpa2加密模式下的密码,及其他相关参数。最终调用该对象的build()
方法,返回建造出来的WifiNetworkSuggestion
wifi网络建议类的实例化对象。可以同时创建多个不同的WifiNetworkSuggestion
对象,以List
列表的形式保存。
之后调用WifiManager
管理类对象的addNetworkSuggestions(List<WifiNetworkSuggestion> networkSuggestions)
方法,参数 networkSUggestions 便是所有要保存的WifiNetworkSuggestion
对象集合。返回int
类型的结果标记添加操作是否执行成功,如果执行成功,将会返回WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS=0
的标记值。
在网络添加成功后,同样可以通过注册自定义的BroadcastReceiver
的方式监听网络连接状态。与API 29以前的版本不同的是,这里要监听的Intent
意图对象中的参数 action 行为值为WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION="android.net.wifi.action.WIFI_NETWORK_SUGGESTION_POST_CONNECTION"
,在该行为值下同样可以获取网络状态信息。
Android系统编程入门系列之硬件交互——无线通信WLAN的更多相关文章
- Android系统编程入门系列之硬件交互——多媒体摄像头
多媒体系列硬件 多媒体包括图片.动画.音频.视频,这些多媒体素材的采集(输入)主要依靠摄像头和麦克风等硬件设备转化为基础数据,而他们的播放渲染(输出),则需要依靠具有相关功能的编解码软件.当然随着硬件 ...
- Android系统编程入门系列之硬件交互——传感器
到目前为止,关于应用程序与用户之间的相关内容便比较肤浅的大致介绍完毕.而在整个系统架构中,应用程序与用户之间的交互,犹如参天大树上的枝干和树叶,交互起来五彩缤纷,但使整个生态系统保持生命力的核心,在于 ...
- Android系统编程入门系列之硬件交互——通信硬件USB
在硬件交互的首篇对设备硬件的分类中,互联通信系列硬件主要用来与其他设备进行数据交互.从本文开始,将重点介绍该系列相关硬件. 互联通信系列硬件 根据硬件的可通信距离,由近及远分为USB.NFC.蓝牙.W ...
- Android系统编程入门系列之硬件交互——通信硬件Bluetooth
通信硬件NFC的文章,虽然可以在Android系统中通过非直接接触的形式与支持NFC硬件的设备通信,但是也只能交互一些简短的标签内容,对大量的持续性数据,却并不能很好的支持.因此针对这个弊端,可以考虑 ...
- Android系统编程入门系列之硬件交互——通信硬件NFC
在上篇文章介绍了接入式USB硬件的简单使用,接下来将介绍不依赖物理连接的硬件通信了.本文的重点是近距离通信的硬件NFC. NFC硬件 应用程序中可以通过NFC硬件读取或发送指定协议的技术实现,在And ...
- Android系统编程入门系列之硬件交互——通信硬件电信SIM卡
现在的SIM卡通常具备基站定位.语音通话.短信消息.网络流量这四大功能,而在移动端是无法对SIM卡使用基站定位功能的,所以这里只介绍移动端如何使用SIM卡实现语音通话.短信消息.数据流量三个功能. 语 ...
- Android系统编程入门系列之硬件交互——多媒体麦克风
在多媒体摄像头及相关硬件文章中,对摄像头的使用方式需要区分应用程序的目标版本以使用不同的代码流程,而与之相比,麦克风硬件的使用就简单多了. 麦克风及相关硬件 麦克风硬件在移动设备上作为音频的采集设备, ...
- Android系统编程入门系列之硬件交互——多媒体展示
前两篇文章通过麦克风硬件和摄像头硬件分别采集音频和视频的多媒体数据,在得到的多媒体数据通常是以编码文件的格式存储,在用户需要展示时,可通过设备的内置扩音器或蓝牙耳机等硬件播放音频,通过设备的显示屏或外 ...
- Android系统编程入门系列之加载界面Activity
上回说到应用初始化加载及其生命周期,在Android系统调用Applicaiton.onCreate()之后,继续创建并加载清单文件中注册的首个界面即主Activity,也可称之为入口界面.主Acti ...
随机推荐
- 使用 electron 和 electron-forge 加载 本地磁盘资源 img 的问题
最近在学习使用 electron 进行桌面开发一款图片压缩的软件.遇到了加载本地磁盘文件的问题.记录一下其解决方案. 使用 electron 加载本地磁盘文件 第一种方法 设置webPreferenc ...
- java中的继承 和多态。
package com.aaa.zxf.ajax.test; /** *一. java 中的继承和多态. * * 继承的特性? * 1.实现继承的方式 * A 如何建立继承关系(一个类继承于 另一个类 ...
- 【第十二期】腾讯后台实习初试、复试、HR面经 (许愿OC)
楼主投的很晚属于正常批才开始,初试面试官比较重基础,复试面试官比较看综合能力,HR小姐姐声音好听,腾讯面试官都特别nice! 一面: 看你项目很多,你挨个给我介绍一遍吧 我:一大堆按着简历介绍 日志文 ...
- .NET 6全文检索引擎Lucene.NET 4.8简单封装
前言 因为最近在做一个检索数据的工具.最开始用的Mysql8自带的全文检索功能.但是发现这货数据量超过百万之后,检索速度直线下降. 于是想到Lucene.net.花了一晚上时间做了简单的封装.可以直接 ...
- VUE项目部署到线上生产环境,Loading chunk xxx failed
项目部署到生产环境,路由点击无效,报错 Loading chunk chunk-xxxxx failed.(missing xxxx) 加载失败,错误的路径. 话不多说,直接贴代码: vue.conf ...
- 【密码学工具】Ciphey和WinDecrypto的使用随笔
1.Ciphey 官方文档 这个工具安装起来也很容易,用pip下载即可. pip install ciphey -i https://pypi.mirrors.ustc.edu.cn/simple/ ...
- 【SCOI2007】组队(单调性)
题目链接 大意 给定\(N\)个人与三个常量\(A,B,C\),每个人有两个属性:\(Hi\),\(Vi\). 现要让你选些人出来,定义\(Hmin\)为选出来的这些人中最小的\(Hi\)值,\(Vm ...
- python小白记录一 ——python脚本生成windows可执行exe
1.需要安装pywin32 先查看自己有没有安装:使用如下命令查看 pip show pywin32 如果没有则用下面方式进行安装: pip install pywin32 然后等待安装完成: 2.再 ...
- ssh一段时间无操作后自动断开连接(假死)问题
平时使用ssh远程服务器的时候(注:远程虚拟机一般不会有这个问题),一段时间没有操作,ssh连接就会处于假死状态,以至于需要重新进行ssh连接,不管你用的什么远程工具都会出现这个问题,那么通过心跳检测 ...
- 7、架构--location、LNMP架构、uwsgi部署、BBS项目部署
笔记 1.晨考 1.Nginx中常用的模块 autoindex stub_status allow 和 deny basic limit_conn limit_req 2.配置步骤 1.创建连接池 2 ...