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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 23:05:27