Android WiFi通信基础
权限配置
权限名称 |
作用范围 |
说明 |
ACCESS_WIFI_STATE |
读取WiFi状态 |
获取当前WiFi连接状态(如是否已连接) |
CHANGE_WIFI_STATE |
修改WiFi状态 |
开启/关闭WiFi、切换网络等操作 |
ACCESS_NETWORK_STATE |
网络状态权限 |
检测网络连接状态(如是否联网) |
INTERNET |
网络访问权限 |
进行网络通信的必要权限 |
ACCESS_FINE_LOCATION |
定位权限(Android 6.0+) |
扫描WiFi需要精确位置权限 |
注意:Android 6.0及以上系统需动态申请ACCESS_FINE_LOCATION
权限,否则无法扫描WiFi。

WiFi管理核心类
类名 |
功能 |
WifiManager |
系统服务类,管理WiFi开关、扫描、连接等 |
WifiConfiguration |
配置WiFi热点信息(如SSID、密码) |
WifiInfo |
获取当前连接的WiFi信息(如IP、信号强度) |
ScanResult |
存储扫描到的WiFi热点信息 |
WiFi扫描与连接
扫描周围WiFi热点
// 获取WifiManager实例
WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
// 注册广播接收器(监听扫描结果)
IntentFilter filter = new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
registerReceiver(wifiScanReceiver, filter);
// 开始扫描
wifiManager.startScan();
// 广播接收器处理扫描结果
private final BroadcastReceiver wifiScanReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
boolean success = intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, false);
if (success) {
List<ScanResult> results = wifiManager.getScanResults();
// 处理扫描结果(如显示列表)
}
}
};
连接指定WiFi
// 创建WiFi配置对象
WifiConfiguration config = new WifiConfiguration();
config.SSID = """ + targetSSID + """; // 必须加引号
config.preSharedKey = """ + password + """; // 密码需加引号
// 添加配置并连接
int networkId = wifiManager.addNetwork(config);
wifiManager.enableNetwork(networkId, true); // 连接指定网络
创建WiFi热点(AP模式)
// 配置热点信息
WifiConfiguration apConfig = new WifiConfiguration();
apConfig.SSID = "MyHotspot"; // 热点名称
apConfig.preSharedKey = "12345678"; // 至少8位密码
apConfig.hiddenSSID = false; // 是否隐藏热点
apConfig.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
apConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN); // 推荐使用WPA2
apConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
apConfig.status = WifiConfiguration.Status.ENABLED;
// 设置热点并开启
int apNetworkId = wifiManager.addNetwork(apConfig);
wifiManager.enableNetwork(apNetworkId, true);
Android 10+ 特殊处理
特性 |
影响 |
解决方案 |
后台定位限制 |
后台应用无法获取WiFi扫描结果 |
需在前台服务中执行WiFi操作 |
前台服务要求 |
启动WiFi需关联前台服务 |
使用startForegroundService() 并显示通知 |
WiFi数据传输
Socket通信示例(客户端)
// 获取WiFi分配的IP地址
String serverIP = wifiManager.getConnectionInfo().getIpAddress(); // 需转换为可读格式
// 创建Socket连接
Socket socket = new Socket(serverIP, 8888); // 服务器端口需一致
OutputStream out = socket.getOutputStream();
out.write("Hello WiFi".getBytes()); // 发送数据
服务端Socket监听(需在另一设备/PC)
ServerSocket server = new ServerSocket(8888);
Socket client = server.accept(); // 等待连接
BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
String message = reader.readLine(); // 接收数据
WiFi P2P(直连技术)
核心API
类名 |
功能 |
WifiP2pManager |
管理P2P连接生命周期 |
WifiP2pConfig |
配置P2P连接参数 |
ConnectionInfo |
获取P2P连接状态(如IP地址) |
基本流程
- 初始化P2P框架:
wifiP2pManager.initialize()
- 发现设备:
wifiP2pManager.discoverPeers()
- 请求连接:
wifiP2pManager.connect()
- 获取连接信息:通过
WIFI_P2P_CONNECTION_CHANGED_ACTION
广播获取ConnectionInfo
常见问题与解决方案
问题 |
原因 |
解决方案 |
无法扫描WiFi |
未授予定位权限 |
动态申请ACCESS_FINE_LOCATION 权限 |
连接失败(Error: -1) |
密码或加密方式不匹配 |
检查WifiConfiguration 中的preSharedKey 和加密类型 |
Android 10后台限制 |
应用退到后台后WiFi断开 |
使用前台服务(ForegroundService )保持连接 |
P2P连接超时 |
设备未开启WLAN频段 |
确保两设备支持相同WiFi频段(2.4G/5G) |
相关问题与解答
Q1: 如何在Android 10+中保持WiFi连接?
A: Android 10限制后台应用的网络操作,需通过以下方式解决:
- 将WiFi操作放在前台服务中。
- 使用
WorkManager
调度周期性任务。
- 引导用户将应用加入电池优化白名单。
Q2: WiFi扫描性能差怎么办?
A: 优化扫描性能的方法:
- 减少扫描频率(如每5分钟扫描一次)。
- 过滤无关热点(如通过SSID白名单)。
- 使用
WifiManager.START_SCAN_FAILED_LISTENER
监听扫描失败