Flutter在Android 12/13中获取WIFI SSID返回NULL的解决方法
解决Android 12+获取WiFi SSID为NULL的问题
1. 补充AndroidManifest权限配置
在现有权限基础上,添加适配Android 12+的权限声明:
<!-- Android 13+ 专属:无需位置权限即可获取当前连接的WiFi信息 --> <uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES" android:usesPermissionFlags="neverForLocation" /> <!-- 限制位置权限仅在Android 12及以下生效 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="32" />
NEARBY_WIFI_DEVICES权限无需用户手动授权,系统会自动授予,neverForLocation标记用于明确该权限不用于定位用途。
2. 代码中适配权限与位置服务检查
依赖准备
确保已添加以下依赖到pubspec.yaml:
dependencies: network_info_plus: ^latest_version permission_handler: ^latest_version geolocator: ^latest_version device_info_plus: ^latest_version
修改获取WiFi信息的逻辑
import 'package:flutter/foundation.dart'; import 'package:network_info_plus/network_info_plus.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:geolocator/geolocator.dart'; import 'package:device_info_plus/device_info_plus.dart'; import 'dart:developer' as dev; Future<void> setNetwork() async { final info = NetworkInfo(); bool canAccessWifi = false; if (defaultTargetPlatform == TargetPlatform.android) { final androidInfo = await DeviceInfoPlugin().androidInfo; final int sdkVersion = androidInfo.version.sdkInt; if (sdkVersion >= 33) { // Android 13+ 检查NEARBY_WIFI_DEVICES权限 final wifiPermStatus = await Permission.nearbyWifiDevices.status; if (wifiPermStatus.isDenied) { await Permission.nearbyWifiDevices.request(); } canAccessWifi = await Permission.nearbyWifiDevices.isGranted; } else { // Android 12及以下:检查位置权限+位置服务状态 var locationStatus = await Permission.location.status; if (locationStatus.isDenied) { await Permission.locationWhenInUse.request(); } if (await Permission.location.isRestricted) { openAppSettings(); } // 必须开启位置服务才能获取WiFi信息 bool locationServiceEnabled = await Geolocator.isLocationServiceEnabled(); if (!locationServiceEnabled) { await Geolocator.openLocationSettings(); locationServiceEnabled = await Geolocator.isLocationServiceEnabled(); if (!locationServiceEnabled) { dev.log('位置服务未开启,无法获取WiFi信息'); return; } } canAccessWifi = await Permission.location.isGranted; } } else { // iOS或其他平台直接允许(根据实际需求调整) canAccessWifi = true; } if (canAccessWifi) { final wifiName = await info.getWifiName(); dev.log('wifiName $wifiName'); } }
核心原因
- Android 12(API 31)起,系统要求获取WiFi SSID/BSSID必须同时满足:授予
ACCESS_FINE_LOCATION权限且开启系统位置服务,缺一不可。 - Android 13(API 33)新增
NEARBY_WIFI_DEVICES权限,专门用于WiFi设备信息获取,无需依赖位置权限,降低了权限申请的门槛。
内容的提问来源于stack exchange,提问作者Sheep who love carrots
相关产品推荐
相关产品推荐

