【Android】Wifiスキャンをする

前の記事でWifi情報を取得する方法をご紹介した。

Wifiの情報は時間が経つと「変化」するので、最新情報を手に入れるには、スキャンする必要がある。

以下のページを参考にwifiのスキャンを実装してみる。

https://developer.android.com/guide/topics/connectivity/wifi-scan?hl=ja

パーミッションは

CHANGE_WIFI_STATE

が必要なのでマニフェストに追記する。

dangerousではなく、normalパーミッションなので実行時の同意は取らなくて良い。

次に、ブロードキャストを受け取るための処理を記載する。


        //ブロードキャスト受け取った時の処理
        val wifiScanReceiver = object : BroadcastReceiver() {

            override fun onReceive(context: Context, intent: Intent) {
                val success = intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, false)
                if (success) {
                    scanSuccess()
                } else {
                    scanFailure()
                }
            }
        }

        //レシーバーの登録
        // startScanを呼ぶと、SCAN_RESULTS_AVAILABLE_ACTIONがブロードキャストされる。
        val intentFilter = IntentFilter()
        intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)
        registerReceiver(wifiScanReceiver, intentFilter)

startScanを呼ぶか、他のアプリがスキャンを実行した時にインテントを受け取るようにする。

スキャンが成功した時と失敗した時のそれぞれの処理を記載する。

    private fun scanSuccess() {
        Toast.makeText(this@MainActivity, "scan success!!!!", Toast.LENGTH_SHORT).show()
        //スキャン結果の取り出し
    }

    private fun scanFailure() {
        // handle failure: new scan did NOT succeed
        // consider using old scan results: these are the OLD results!
        Toast.makeText(this@MainActivity, "scan fail!!!!", Toast.LENGTH_SHORT).show()
    }

あとはボタンを押した時にスキャン実行する。

        button_scan.setOnClickListener {
            val success = wifiManager.startScan()
            if (!success) {
                // scan failure handling
                scanFailure()
            }
        }

Android9以降でフォアグラウンドアプリの場合、2分間で4回までのスキャンが許されている。

試しに5回目のスキャンをしてみたら、scanFailureが呼び出された。

あとはスマホを持ってうろうろしてみて、他のアプリがスキャンをした時に、ブロードキャストのインテントを受信しスキャン結果が更新されたことを確認できた。