Android Kotlin 获取 WiFi 信号强度(以 dBm 为单位)

问题描述 投票:0回答:2

我正在开发一个 Flutter 应用程序,需要获取以 dBm 为单位的 WiFi 信号强度。我的 Flutter 应用程序使用 Android Kotlin 和 Android 12 以及 Android SDK 33

我在互联网上找到了一些示例代码(当然还有 Stackoverflow),但它们似乎在我使用的最新 Android 版本中已被弃用。

我还在 Android 文档中找到了 SignalStrength https://developer.android.com/reference/kotlin/android/telephony/SignalStrength但我不知道如何使用它,没有示例代码。

有人可以帮我解决这个问题吗?

非常感谢。

kotlin wifi
2个回答
0
投票

对于那些正在寻找解决方案的人。这是我的工作代码:

package com.example.myapp

import android.content.Context
import android.content.ContextWrapper
import android.content.Intent
import android.content.IntentFilter
import android.os.BatteryManager
import android.os.Build.VERSION
import android.os.Build.VERSION_CODES
import android.content.BroadcastReceiver
import android.net.wifi.WifiManager
import android.net.ConnectivityManager
import android.net.ConnectivityManager.NetworkCallback
import android.net.NetworkCapabilities
import android.net.Network
import android.net.TransportInfo
import android.net.wifi.WifiInfo
import android.net.NetworkRequest
import android.util.Log

import androidx.annotation.NonNull
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel

class MainActivity: FlutterActivity() {
    private val CHANNEL = "myapp.flutter.dev"
    private var wifiSignalStrength: Int = 0

    val networkRequest: NetworkRequest = NetworkRequest.Builder().addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build()

    val networkCallback = object: NetworkCallback() {
        override fun onAvailable(network: Network) {}

        override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) {
            val wifiInfo: WifiInfo = networkCapabilities.getTransportInfo() as WifiInfo
            wifiSignalStrength = wifiInfo.getRssi()
            Log.d("[log]", "wifiSignalStrength ${wifiSignalStrength}")
        }
    }

    val myRssiChangeReceiver = object : BroadcastReceiver() {
        override fun onReceive(p0: Context?, p1: Intent?) {
            val wifiManager = getSystemService(Context.WIFI_SERVICE) as WifiManager
            if (VERSION.SDK_INT >= VERSION_CODES.S) {
                val wifiInfo = wifiManager.getConnectionInfo()
                wifiSignalStrength = wifiInfo.getRssi()
            }
        }
    }

    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)

        if (VERSION.SDK_INT >= VERSION_CODES.S) {
            val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
            connectivityManager.requestNetwork(networkRequest, networkCallback) // For request
            connectivityManager.registerNetworkCallback(networkRequest, networkCallback) // For listen
        }
        else {
            registerReceiver(myRssiChangeReceiver, IntentFilter(WifiManager.RSSI_CHANGED_ACTION))
        }
        
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler {
            call, result ->
                if (call.method == "getWifiSignalStrength") {
                    result.success(wifiSignalStrength)
                }
                else {
                    result.notImplemented()
                }
        }
    }
}

0
投票

可以参考我提供的NetStateUtils,它处理SDK兼容性,也处理VPN模式下的wifi强度。

© www.soinside.com 2019 - 2024. All rights reserved.