LINUX.ORG.RU

SignalStrength сотовой сети на Андроиде

 , phonestatelistener


0

1

Решил тут ради эксперимента написать простейший апп для Андроида, но за незнанием API всего этого безобразия, параллельно решил протестить, что мне подскажет chatGPT.

Идея аппа такая: Всего одна кнопка, при нажатии на неё каждую минуту апп проверяет, доступна ли сотовая сеть (ну, скажем, сигнал больше N дБ), а если кнопку опять нажать, проверять перестанет, и выведет относительное время доступности сети за измеряемый промежуток времени.

chatGPT создал прекрасный костяк приложения, который после дополнительных распросов даже собрался без ошибок, но… при изменении уровня сигнала никаких апдейтов не происходит. Т.е. коллбэк, который листнер должен вызывать, вызывается только один раз, в значении всегда 99 попугаев, и больше коллбэк не вызывается, как ни носись со смартфоном по разным углам квартиры.

Но уровень сигнала таки изменяется, что видно и по количеству «палок», и в стороннем аппе.

Привожу далее ключевой момент (листнер и коллбэк, и как они привязаны к MainActivity).

Сперва листнер:

class SignalStrengthListener(private val context: Context, private val textView : TextView) : PhoneStateListener() {
    var signalStrengthdBm : Int = 0

    override fun onSignalStrengthsChanged(signalStrength: SignalStrength) {
        Log.d("SignalStrength", "onSignalStrengthsChanged")
        super.onSignalStrengthsChanged(signalStrength)
        // Get TelephonyManager
        val telephonyManager = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager

        // Check if the network type is cellular
        if (telephonyManager.phoneType == TelephonyManager.PHONE_TYPE_GSM ||
            telephonyManager.phoneType == TelephonyManager.PHONE_TYPE_CDMA) {

            // Get signal strength in dBm (decibels)
            signalStrengthdBm = if (telephonyManager.phoneType == TelephonyManager.PHONE_TYPE_GSM) {
                signalStrength.gsmSignalStrength
            } else {
                // For CDMA networks
                signalStrength.cdmaDbm
            }
            textView.text = String.format("Strength(dB): %-10d", signalStrengthdBm)

            // Check if the signal strength is significant for cellular communication
            if (isSignalStrengthSignificant(signalStrengthdBm)) {
                Log.d("SignalStrength", "Signal strength is significant: $signalStrengthdBm dBm")
                // Perform actions based on significant signal strength
            } else {
                Log.d("SignalStrength", "Signal strength is not significant: $signalStrengthdBm dBm")
                // Perform actions based on non-significant signal strength
            }
        }
    }

    private fun isSignalStrengthSignificant(signalStrengthdBm: Int): Boolean {
        // You can define your own criteria for determining if the signal strength is significant.
        // For example, you might consider a threshold value for the signal strength.
        return signalStrengthdBm >= -100 // Example threshold: -100 dBm
    }
}

Кусок кода, активирующий листнер:

        val telephonyManager = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
        val signalStrengthListener = SignalStrengthListener(this, auxTextView)
        telephonyManager.listen(signalStrengthListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS)

О том, что onSignalStrengthsChanged вызывается только один раз и только в самом начале после старта аппа, я знаю из содержимого Logcat, в котором только одна соотв. запись.

Пара неоднозначных моментов:

  1. собирается для API level 31, тестировал как на эмуляторе с таким же API level, так и на реальном xiaomi с Андроид 13;

  2. Android Studio сигналит, что PhoneStateListener deprecated. Но в какой версии оно депрекейтед и что использовать вместо него - не понятно.

Есть какие идеи?

Перемещено Zhbert из mobile

★★★★★

Android Studio сигналит, что PhoneStateListener deprecated. Но в какой версии оно депрекейтед и что использовать вместо него - не понятно

Вероятно загуглить документацию по PhoneStateListener и узнать, что нужно использовать TelephonyCallback

asaks
()
Ответ на: комментарий от asaks

Так. После траходрома с targetAPI, compileAPI и проч., «перетрахиванием»(С) gradle конфига и скачивания эмулятора нужной версии таки завёл TelephonyCallback и вроде оно работает как надо. Спасибо. Примите от меня две виртуальные чашки чая.

seiken ★★★★★
() автор топика
Последнее исправление: seiken (всего исправлений: 1)