使用 kotlin 在 android 中实现网络信号

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

我有一个问题,我必须在应用程序中显示信号强度。就像我们的手机在信号强度差时显示塔一样,它只显示一座塔,而在信号强度好的情况下,它会显示所有塔。

同样的,我也想计算信号强度。

谢谢

android kotlin
2个回答
0
投票

您可以使用电话状态监听器为您提供信号强度。首先,全局定义。

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

这个信号强度值变量保存的是信号强度的数据


0
投票

改编自一些来源[1][2][3](还有上面userVaniRamesh 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()
© www.soinside.com 2019 - 2024. All rights reserved.