一段时间以来,我在使用 Android 的 TelephonyManager 时遇到了问题。我们使用 TelephonyManager 进行电话信号实时测量,但在尝试升级到 API 29 时,它已成为一个问题。在 API 28 及以下版本中,我们只需用来TelephonyManager.allCellInfo
从设备获取所有单元格信息,它就可以完美运行。但是,如果您以 API 29 为目标并使用上面相同的代码,那么读数就不会改变。它们通常会在您每次请求时发生变化,即使只是稍微像从 -98 到 -99 的信号变化。
我发现在 API 29 上,该过程必须与 Android 文档中所解释的有所不同。 https://developer.android.com/reference/android/telephony/TelephonyManager#requestCellInfoUpdate(java.util.concurrent.Executor,%20android.telephony.TelephonyManager.CellInfoCallback)
文档中的措辞如下:“针对 Android Q 或更高版本的应用程序将不再通过调用此 API 来触发缓存的 CellInfo 的刷新。相反,这些应用程序将收到最新的缓存结果,该结果可能不是最新的。针对 Android 的应用程序希望请求更新的 CellInfo 的 Q 或更高版本应调用 requestCellInfoUpdate();但是,在所有情况下,更新都会受到速率限制并且无法保证。要确定 CellInfo 数据的新近度,调用者应检查 CellInfo#getTimeStamp()。
因此使用TelephonyManager.allCellInfo
不再触发数据刷新。相反,我使用TelephonyManager.requestCellInfoUpdate
并使用了回调。我用来解决这个问题的代码如下。
注意,这是 Kotlin,但同样适用于 Java。
val tm: TelephonyManager = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
tm.requestCellInfoUpdate(context.mainExecutor, object : CellInfoCallback() {
override fun onCellInfo(activeCellInfo: MutableList<CellInfo>) {
for (cellInfo in activeCellInfo) {
val timeStamp = …
Run Code Online (Sandbox Code Playgroud) 在做了一些挖掘之后,我发现谷歌源代码包含与 NR(新无线电)相关的 5G 信息。有趣的是,这些更改在 dev 或 pie-dev 上不可用,但在 master 分支上可用!
5g 的 CellInfo 类 https://android.googlesource.com/platform/frameworks/base/+/master/telephony/java/android/telephony/CellInfoNr.java
5g电话类列表:
CellIdentityNr.java
CellInfoNr.java
CellSignalStrengthNr.java
我希望我的应用程序在第一部 5G 手机即将推出之前开始支持 5G,但新类不在我正在构建的 SDK 中 (28) 我需要等待 Android Q 吗?4G的故事是什么?
我有一个 Android 应用程序可以获取手机信号塔的信息。我使用 getAllCellInfo() 来获取主小区和相邻小区的信息。我将 ACCESS_COARSE_LOCATION 权限包含到 manifest.xml 中,并在运行时请求该权限。它适用于其他手机,但在华为荣耀7中,该函数返回一个空列表。
我的代码:
目录:
我检查了其他人的问题: getAllCellInfo returns null in android 4.2.1和Android getAllCellInfo() returns null。
从一个问题中,我想到华为手机不支持 getAllCellInfo() ,直到我安装了Network Cell Info Lite和NetMonster,并且应用程序似乎可以在华为荣耀7中获取手机信息:
有人有这方面的信息吗?
目标:获取特定类型连接(我实际使用的连接)的信息(信号强度)。
问题:我不确定到底什么是 reperesentCellInfo
以及如何从中提取信息getAllCellInfo
问题:
1)来自android开发者网站
CellInfo:来自某个时间点的不可变单元格信息。
这是什么意思?
2) 我想了解我使用的是 wcdma、umts、gsm 还是 lte。我在这里找到了一段使用getAllCellInfo的代码,低于我的改编版本以获得信号强度
for (final CellInfo info : telephonyManager.getAllCellInfo()) {
if (info instanceof CellInfoGsm) {
final CellSignalStrengthGsm gsm = ((CellInfoGsm) info).getCellSignalStrength();
if(gsm.getLevel() >= localMaxSignalStrength)
localMaxSignalStrength = gsm.getLevel();
Toast.makeText(getApplicationContext(), "gsm rssi" + localMaxSignalStrength, Toast.LENGTH_LONG).show();
} else if (info instanceof CellInfoWcdma) {
final CellSignalStrengthWcdma cdma = ((CellInfoWcdma) info).getCellSignalStrength();
if(cdma.getLevel() >= localMaxSignalStrength)
localMaxSignalStrength = cdma.getLevel();
Toast.makeText(getApplicationContext(), "wcdma rssi" + localMaxSignalStrength, Toast.LENGTH_LONG).show();
} else if (info instanceof …
Run Code Online (Sandbox Code Playgroud) 我正在尝试检测 5G 网络。我使用电话管理器来获取NETWORK_TYPE。即使我在 5G 网络覆盖中并且我的手机显示 5G,我也没有得到 NETWORK_TYPE_NR。NETWORK_TYPE 始终为 13,即 LTE。Phones Engineering 服务模式显示 NR 相关数据。有没有办法检测 NR(独立或非独立)模式?
我还需要获取 NR 数据的单元信息。我使用telephonyManager.getAllCellinfo(),但我从未得到过cellinfonr的实例。
任何帮助表示赞赏。谢谢
我正在新的 Android studio 预览版上尝试网络类型 5G 上的 Android 11。我的目标是获取单元信息详细信息。但是,方法 getAllCellInfo() 在模拟器上返回空/空列表。Android 11 之前的所有模拟器都会返回有效值。我需要做任何额外的配置才能使其在 Android 11 上运行吗?
我正在尝试获取设备可以找到的所有可用单元的列表。但是我被卡住了,因为我的CellInfo始终为null,我不知道为什么。有人可以给我提示吗?Google的onCellInfoChanged()信息很少。
主要活动:
CellListener cellListener = new CellListener(this);
cellListener.start();
Run Code Online (Sandbox Code Playgroud)
CellListener:
public class CellListener extends PhoneStateListener {
private static final String TAG = "CellListener";
private TelephonyManager telephonyManager = null;
private PhoneStateListener listener = null;
private String newCell = null;
private int events = PhoneStateListener.LISTEN_CELL_LOCATION | PhoneStateListener.LISTEN_CELL_INFO;
private Context context = null;
public CellListener(Context context) {
this.context = context;
}
public void start() {
telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
CellLocation.requestLocationUpdate();
telephonyManager.listen(this, events);
}
@Override
public void onCellInfoChanged(List<CellInfo> cellInfo) {
Log.i("CellListener","onCellInfoChanged(List<CellInfo> cellInfo) ");
super.onCellInfoChanged(cellInfo);
if(cellInfo …
Run Code Online (Sandbox Code Playgroud) 我读到getAllCellInfo(所有帖子),并有像类似的情况本。下面发布的代码在 Android 6 (OnePlus One) 上运行良好,但在 Google Nexus 5x Android 8.1 API 27 上返回一个空的 Cellinfo 列表。我在清单中设置了 Permission ACCESS CORSE LOCATION 并在第一次运行应用程序时请求许可.
这是一个代码片段:
try {
TelephonyManager tm = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
String networkOperator = "";
if (tm.getPhoneType() == TelephonyManager.PHONE_TYPE_GSM) {
networkOperator = tm.getNetworkOperator();
}
if (!TextUtils.isEmpty(networkOperator)) { //is not empty with Nexus 5x
mcc = networkOperator.substring(0, 3);
mnc = networkOperator.substring(3);
} else {
mcc = "Unbekannt";
mnc = "Unbekannt";
}
List<CellInfo> cell = tm.getAllCellInfo();
System.out.println("List: "+cell);
if (cell != null) …
Run Code Online (Sandbox Code Playgroud) 我正在寻找输出内部小区信息(如 RSRP、RSRQ、SINR、RSSI)的文档。
我想查看5G(新无线电)数据。
cellRSRP = ((CellSignalStrengthNr) ((CellInfoNr) cellInfo).getCellSignalStrength()).getCsiRsrp();
Run Code Online (Sandbox Code Playgroud)
这就是我尝试获得 5G 的 cellRSRP 的方法。这与获取 LTE 数据非常相似。
这不起作用,因为我故意施放
(CellSignalStrengthNr)
Run Code Online (Sandbox Code Playgroud)
在此代码上
((CellInfoNr) cellInfo).getCellSignalStrength())
Run Code Online (Sandbox Code Playgroud)
由于getCellSignalStrength()
不返回CellSignalStrengthNr
数据,(它返回CellSignalStrength
)
所以我只是投射代码,没有检测到错误,一切似乎都很顺利。
但事实并非如此,我来这里是为了问一个问题。
所以,简而言之,
CellSignalStrengthNr
没有不用铸造的正常制作方法?