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

Kotlin中WifiManager无法自动更新扫描结果的问题求助

解决Kotlin中WifiManager扫描结果无法实时更新的问题

你遇到的核心问题是没有主动触发WiFi扫描:scanResults返回的是设备最近一次扫描的缓存结果,你每秒调用它但没发起新的扫描,自然无法获取到新的WiFi网络(比如net1)。只有当系统或其他应用触发扫描时(比如WiFi设置页面),缓存才会更新。要实现实时更新,需要主动发起扫描并监听扫描完成的事件,具体步骤如下:

1. 配置必要权限

在AndroidManifest.xml中添加以下权限:

<!-- 基础WiFi权限 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!-- 定位权限(Android 6.0+ 必须,WiFi扫描依赖位置服务) -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- Android 12+ 额外需要 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

注意:Android 6.0及以上版本需要动态申请定位权限,否则扫描会失败。

2. 主动发起扫描并监听结果

不能直接每秒调用scanResults,正确流程是:发起扫描 → 监听扫描完成广播 → 在广播回调中获取最新的scanResults。

示例代码:

class WifiScanActivity : AppCompatActivity() {
    private lateinit var wifiManager: WifiManager
    private lateinit var scanReceiver: BroadcastReceiver

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_wifi_scan)

        // 初始化WifiManager
        wifiManager = applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager

        // 注册扫描结果广播接收器
        scanReceiver = object : BroadcastReceiver() {
            override fun onReceive(context: Context?, intent: Intent?) {
                if (intent?.action == WifiManager.SCAN_RESULTS_AVAILABLE_ACTION) {
                    // 扫描完成,获取最新结果
                    val latestResults = wifiManager.scanResults
                    // 处理最新的WiFi列表,比如更新UI
                    updateWifiList(latestResults)
                }
            }
        }
        IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION).also {
            registerReceiver(scanReceiver, it)
        }

        // 启动定时扫描(比如每秒一次)
        val scanHandler = Handler(Looper.getMainLooper())
        val scanRunnable = object : Runnable {
            override fun run() {
                // 主动发起扫描
                val scanStarted = wifiManager.startScan()
                if (!scanStarted) {
                    // 扫描启动失败,可能是权限不足或WiFi未开启
                    Log.e("WifiScan", "扫描启动失败,请检查权限和WiFi状态")
                }
                // 1秒后再次发起扫描
                scanHandler.postDelayed(this, 1000)
            }
        }
        scanHandler.post(scanRunnable)
    }

    private fun updateWifiList(results: List<ScanResult>) {
        // 这里处理WiFi列表更新逻辑,比如打印或刷新RecyclerView
        results.forEach {
            Log.d("WifiScan", "WiFi名称:${it.SSID},信号强度:${it.level}")
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        // 记得注销广播接收器,避免内存泄漏
        unregisterReceiver(scanReceiver)
    }
}

3. 关键注意事项

  • 扫描频率限制:部分Android设备对扫描频率有系统限制(比如1分钟内最多扫描几次),过于频繁的扫描可能会被系统拦截,导致startScan()返回false。
  • 位置服务开启:Android 6.0+要求必须开启位置服务才能进行WiFi扫描,否则扫描会失败。
  • 动态权限申请:在代码中需要先检查并申请ACCESS_FINE_LOCATION权限,示例代码中省略了这部分,你需要补充权限申请逻辑。

内容的提问来源于stack exchange,提问作者kaan kaya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:05:52