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