Android Kotlin(Android12/SDK33)获取WiFi信号强度(dBm)咨询
Android 12(SDK 33)下获取WiFi信号强度(dBm)的适配方案(Flutter插件开发)
一、权限配置
首先在AndroidManifest.xml中添加必要权限:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
注意:Android 12及以上,获取WiFi信号强度必须申请
ACCESS_FINE_LOCATION,即使仅获取当前连接的WiFi,这是系统强制要求的权限限制。
二、Kotlin端核心实现代码
通过ConnectivityManager和NetworkCapabilities获取当前WiFi连接的信号强度,替代已废弃的WifiManager相关API:
import android.content.Context import android.net.ConnectivityManager import android.net.NetworkCapabilities private fun getCurrentWifiSignalDbm(context: Context): Int? { val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager // 获取当前活跃网络 val activeNetwork = connectivityManager.activeNetwork ?: return null val networkCapabilities = connectivityManager.getNetworkCapabilities(activeNetwork) ?: return null // 验证当前网络是否为WiFi if (!networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) { return null } // 获取SignalStrength并提取RSSI(即dBm值) val signalStrength = networkCapabilities.signalStrength ?: return null return signalStrength.rssi }
signalStrength.rssi返回的dBm值范围通常是-30(信号极强)到-100(信号极弱),返回-200表示无效信号值。
三、Flutter与Android端通信(MethodChannel实现)
在MainActivity中配置MethodChannel,将信号强度传递给Flutter端:
import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.engine.FlutterEngine import io.flutter.plugin.common.MethodChannel class MainActivity : FlutterActivity() { private val CHANNEL = "your.package.name/wifi_signal" override fun configureFlutterEngine(flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result -> when (call.method) { "getWifiDbm" -> { // 先检查权限是否已授予 if (checkSelfPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) != android.content.pm.PackageManager.PERMISSION_GRANTED) { result.error("PERMISSION_DENIED", "需要授予位置权限以获取WiFi信号强度", null) return@setMethodCallHandler } val dbm = getCurrentWifiSignalDbm(this) dbm?.let { result.success(it) } ?: run { result.error("NO_WIFI_CONNECTION", "未连接到WiFi网络", null) } } else -> result.notImplemented() } } } // 上面的getCurrentWifiSignalDbm方法放在这里 private fun getCurrentWifiSignalDbm(context: Context): Int? { val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager val activeNetwork = connectivityManager.activeNetwork ?: return null val networkCapabilities = connectivityManager.getNetworkCapabilities(activeNetwork) ?: return null if (!networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) { return null } val signalStrength = networkCapabilities.signalStrength ?: return null return signalStrength.rssi } }
四、Flutter端调用代码
import 'package:flutter/services.dart'; class WifiSignalUtils { static const MethodChannel _channel = MethodChannel('your.package.name/wifi_signal'); static Future<int?> getWifiSignalDbm() async { try { final int? dbm = await _channel.invokeMethod('getWifiDbm'); return dbm; } on PlatformException catch (e) { print("获取WiFi信号强度失败: ${e.message}"); return null; } } }
注意事项
- 动态权限申请:在Flutter端需要先请求
ACCESS_FINE_LOCATION权限,可以使用permission_handler插件来简化权限申请流程。 - 信号更新:如果需要实时监听信号强度变化,可以注册
ConnectivityManager.NetworkCallback,在网络状态变化时重新获取信号强度。
内容的提问来源于stack exchange,提问作者Manh Huynh
相关产品推荐
相关产品推荐

