上一篇
安卓和wifi通信
- 行业动态
- 2025-04-24
- 7
安卓系统通过WifiManager管理WiFi模块,支持IEEE 802.11协议实现无线通信,设备可扫描热点、完成认证及数据交互,支持2.4/5GHz频段,具备智能切换、网络共享及安全加密功能
安卓与WiFi通信核心要点
WiFi基础
WiFi是一种基于IEEE 802.11标准的无线局域网技术,安卓设备通过内置WiFi模块实现以下功能:
- 扫描可用网络:获取周围WiFi热点列表
- 连接认证:输入密码或使用已保存配置
- 数据传输:通过IP协议进行网络通信
- 状态管理:监控连接状态(连接中/已连接/断开)
安卓WiFi管理API
功能分类 | 核心类/方法 | 适用场景 |
---|---|---|
基础状态获取 | WifiManager.isWifiEnabled() |
判断WiFi是否开启 |
WifiManager.getConnectionInfo() |
获取当前连接信息 | |
网络扫描 | WifiManager.startScan() |
触发WiFi网络扫描 |
WifiManager.getScanResults() |
获取扫描结果列表 | |
网络连接 | WifiConfigurator.connect() |
Android 11+ 动态连接(需权限) |
WifiNetworkSuggestion |
Android 10+ 网络建议(跨进程) | |
状态监听 | WifiManager.addNetworkStateListener() |
实时监听网络状态变化 |
完整连接流程(以Android 10+为例)
权限申请:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
创建网络建议:
WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder() .setSsid("TARGET_SSID") .setWpa2Passphrase("password") .build();
提交建议:
wifiManager.addNetworkSuggestions(Collections.singletonList(suggestion));
监听连接状态:
wifiManager.addNetworkStateListener(new NetworkStateListener() { @Override public void onNetworkStateChanged(NetworkInfo networkInfo) { // 处理状态变化 } });
关键权限管理
权限类型 | 作用范围 | 申请时机 |
---|---|---|
位置权限 | Android 6.0+ 扫描/连接必需 | 运行时动态申请 |
CHANGE_WIFI_STATE | 修改WiFi状态(开启/关闭) | 安装时声明 |
ACCESS_WIFI_STATE | 读取WiFi状态 | 安装时声明 |
ACCESS_BACKGROUND_LOCATION | Android 10+ 后台连接 | 需在后台服务中声明 |
常见问题解决方案
问题1:Android 10+ 后台无法自动连接WiFi
解决方案:
- 添加
requestLegacyBackgroundState()
临时方案(仅限targetSdk<30) - 使用
WorkManager
在前台服务中处理连接逻辑 - 引导用户手动添加网络(通过
WifiNetworkSuggestion
)
问题2:WiFi扫描始终返回空列表
排查步骤:
- 检查是否已声明
ACCESS_FINE_LOCATION
权限 - 确认设备硬件WiFi开关已打开
- 验证
startScan()
与getScanResults()
调用间隔(建议>500ms) - 检查设备是否处于飞行模式
相关问题与解答
Q1:如何检测当前是否连接到指定WiFi?
A:通过WifiInfo
获取BSSID比对:
WifiInfo info = wifiManager.getConnectionInfo(); boolean isConnected = "XX:XX:XX:XX:XX".equals(info.getBSSID());
Q2:Android 13如何适配WiFi权限变更?
A:需注意两点:
- 后台扫描需
NEARBY_WIFI_SCANNING
权限(替代位置权限) - 使用
WifiManager.getAvailableFeatures()
检查设备支持情况