小编Hen*_*ler的帖子

Android TelephonyManager requestCellInfoUpdate 返回 API 29 上的过时数据

一段时间以来,我在使用 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)

android rate-limiting telephonymanager kotlin cellinfo

7
推荐指数
0
解决办法
1624
查看次数