当前位置:首页 > 行业动态 > 正文

安卓开发 wifi通信连接

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通信连接  第1张


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地址)

基本流程

  1. 初始化P2P框架:wifiP2pManager.initialize()
  2. 发现设备:wifiP2pManager.discoverPeers()
  3. 请求连接:wifiP2pManager.connect()
  4. 获取连接信息:通过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限制后台应用的网络操作,需通过以下方式解决:

  1. 将WiFi操作放在前台服务中。
  2. 使用WorkManager调度周期性任务。
  3. 引导用户将应用加入电池优化白名单。

Q2: WiFi扫描性能差怎么办?

A: 优化扫描性能的方法:

  1. 减少扫描频率(如每5分钟扫描一次)。
  2. 过滤无关热点(如通过SSID白名单)。
  3. 使用WifiManager.START_SCAN_FAILED_LISTENER监听扫描失败
0