Search code examples
kotlinwifi

Android Kotlin Get WiFi Signal Strength in dBm


I'm developing a Flutter app that requires getting WiFi Signal Strength in dBm. My Flutter app is using Android Kotlin and Android 12 with Android SDK 33

I found some sample code on the Internet (and Stackoverflow of course) but they seem to be deprecated in the latest Android version that I am using.

I also found SignalStrength in Android Docs at https://developer.android.com/reference/kotlin/android/telephony/SignalStrength but I don't know how to use this, there is no sample code.

Could anyone help me to work with this?

Thank you very much.


Solution

  • For those who is searching for the solution. Here is my working code:

    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()
                    }
            }
        }
    }