我有一个问题,我必须在应用程序中显示信号强度。就像我们的手机在信号强度差时显示塔一样,它只显示一座塔,而在信号强度好的情况下,它会显示所有塔。
同样的,我也想计算信号强度。
谢谢
您可以使用电话状态监听器为您提供信号强度。首先,全局定义。
var telephonyManager: TelephonyManager? = null
var psListener: MyPhoneStateListener? = null
然后初始化电话管理器并监听网络的变化。
psListener = MyPhoneStateListener()
telephonyManager = requireActivity().getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
telephonyManager!!.listen(psListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS)
创建一个扩展 PhoneStateListener 的类后,您可以将该类作为 Kotlin 中的内部类。如下
inner class MyPhoneStateListener : PhoneStateListener() {
var signalSupport = 0
override fun onSignalStrengthsChanged(signalStrength: SignalStrength) {
super.onSignalStrengthsChanged(signalStrength)
if (signalStrength.isGsm()) {
signalSupport = signalStrength.gsmSignalStrength
Log.d("signal", "------ gsm signal --> $signalSupport")
if (signalSupport > 30) {
Log.d("signal", "Signal GSM : Good")
} else if (signalSupport in 21..29) {
Log.d("signal", "Signal GSM : Avarage")
} else if (signalSupport in 4..19) {
Log.d("signal", "Signal GSM : Weak")
} else if (signalSupport < 3) {
Log.d("signal", "Signal GSM : Very weak")
}
} else {
signalSupport = signalStrength.getCdmaDbm();
}
signalStrengthValue = signalSupport.toString()
}
}
这个信号强度值变量保存的是信号强度的数据
改编自一些来源[1][2][3](还有上面userVani和Ramesh R的答案),这是一种我认为也适用于最新版本的方法安卓。我只在模拟器上对此进行了测试,因此如果有人发现该方法有任何缺陷或在物理设备上部署时出现任何问题,请随时提出修改或在评论中澄清某些内容。
首先,我们创建一个专门用于确定信号强度的类:
@file:Suppress("DEPRECATION") //<-- Otherwise You'll Probably Get Warnings For The Pre-"Android Snow Cone" Section
package com.example.YOUR_PROJECT_NAME_HERE
import android.Manifest
import android.content.Context
import android.content.pm.PackageManager
import android.os.Build
import android.telephony.CellInfo
import android.telephony.PhoneStateListener
import android.telephony.SignalStrength
import android.telephony.TelephonyManager
import androidx.core.app.ActivityCompat
class ClassSignalStrength (private val mvContext : Context) {
private val mvTelephonyManager = mvContext.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
private var mvTechnology = ""
private var mvSignalStrengthDbm = 0 //<-- Initialize
init {
//Get Signal Strength Data (Pre-"Android Snow Cone")
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
mvTelephonyManager.listen(object : PhoneStateListener() {
@Deprecated("Deprecated in Java")
override fun onSignalStrengthsChanged(mvSignalStrength: SignalStrength) {
super.onSignalStrengthsChanged(mvSignalStrength)
mvTechnology = if (mvSignalStrength.isGsm) "GSM" else "CDMA"
mvSignalStrengthDbm = if (mvTechnology == "GSM") {
2 * mvSignalStrength.gsmSignalStrength - 113 //Convert ASU To dBm
} else {
mvSignalStrength.cdmaDbm //<-- Should Already Be Converted To dBm
}
}
}, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS)
}
}
fun mmGetSignalStrength()
{
//Get Signal Strength
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
//Get Signal Strength Data (Android Snow Cone+)
//Note: The Following Requests An Up-To-Date Rundown Of The Cell Info
if (ActivityCompat.checkSelfPermission(mvContext, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
//Note: requestCellInfoUpdate()'s Updates Are Rate-Limited, Please Be Advised
mvTelephonyManager.requestCellInfoUpdate(mvContext.mainExecutor, object : TelephonyManager.CellInfoCallback() {
override fun onCellInfo(mvCellInfoList: MutableList<CellInfo>) {
mmParseSignalStrength(mvCellInfoList)
}
})
}
}
else {
//Alert User To The Status
//(Explanation: Pre-"Android Snow Cone", The Listener (Which We Declared In The init Block) Should Already Be Updating This Info Automatically)
mmShowUser()
}
}
private fun mmParseSignalStrength(mvCellInfoList : MutableList<CellInfo>)
{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S)
{
//Find The Minimum Signal Strength Value Of All Returned Instances
mvSignalStrengthDbm = 1000000 //<- Create A Large Value To Begin With So We Have A Point Of Reference For Choosing The Next Minimum
for (mvCellInfo in mvCellInfoList) {
if (mvCellInfo.cellSignalStrength.dbm < mvSignalStrengthDbm) {
mvSignalStrengthDbm = mvCellInfo.cellSignalStrength.dbm
mvTechnology = mvCellInfo.javaClass.kotlin.toString()
}
}
//Alert User As To The Status
mmShowUser()
}
}
private fun mmShowUser()
{
//How's The Signal?
val mvSignalQuality= if (mvSignalStrengthDbm < -120) {
"Very Low"
} else if (mvSignalStrengthDbm <= -100) {
"Low"
} else if (mvSignalStrengthDbm <= -90) {
"Normal"
} else {
"Above Average"
}
println("Signal: $mvSignalStrengthDbm ($mvSignalQuality) [$mvTechnology]")
}
}
其次,我们在需要时请求此信息:
private val mvClassSignalStrength = ClassSignalStrength(applicationContext)
…
mvClassSignalStrength.mmGetSignalStrength()