You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 21:30:26