如何通过WifiManager.ConnectionInfo.rssi实时更新TextView内容?
解决RSSI值无法显示在TextView的问题
核心问题与修复方案:
错误使用LocalBroadcastManager接收系统广播
WifiManager.RSSI_CHANGED_ACTION是系统全局广播,LocalBroadcastManager仅能接收本应用内部发送的广播,完全无法捕获系统的RSSI变化通知。修改注册方式为使用Fragment的上下文注册:// 替换原LocalBroadcastManager注册代码 requireContext().registerReceiver(myRssiChangeReceiver, IntentFilter(WifiManager.RSSI_CHANGED_ACTION))同时必须在Fragment销毁时注销广播,避免内存泄漏:
override fun onDestroyView() { super.onDestroyView() requireContext().unregisterReceiver(myRssiChangeReceiver) _binding = null }缺失必要权限
在AndroidManifest.xml中添加WiFi相关权限:<!-- 获取WiFi状态权限 --> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 变更WiFi状态权限(部分系统版本扫描需要) --> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <!-- Android 6.0+ 需位置权限才能获取有效WiFi数据 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />注意Android 6.0及以上版本需要动态申请位置权限,否则无法获取有效RSSI值。
冗余且受限的
startScan()调用RSSI_CHANGED_ACTION广播触发时,系统已在Intent中携带最新RSSI值,无需调用startScan()(Android 8.0+对扫描频率有限制,频繁扫描会被系统拦截)。直接从Intent提取值即可:override fun onReceive(p0: Context?, p1: Intent?) { val newRSSI = p1?.getIntExtra(WifiManager.EXTRA_NEW_RSSI, -200) ?: -200 binding?.wifiData?.text = newRSSI.toString() }空安全优化
避免强制转换引发空指针异常,同时对Binding做空判断:// 若仍需通过connectionInfo获取(不推荐,不如直接从Intent取值) val wifiMan = p0?.getSystemService(Context.WIFI_SERVICE) as? WifiManager val newRSSI = wifiMan?.connectionInfo?.rssi ?: -200 binding?.wifiData?.text = newRSSI.toString()
内容的提问来源于stack exchange,提问作者Feldmarshall
相关产品推荐
相关产品推荐

