3

一段时间以来,我一直在使用 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 的应用程序Q 或更高版本希望请求更新的 CellInfo 应调用 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 = cellInfo.timeStamp // This value determines the age of the data.
        }
    }
})

这几乎解决了读数开始再次出现的问题,但经过进一步检查,似乎限速部分现在是一个新问题,因为读数的时间最长可达 10 秒,这对您来说非常无用重新移动。除了存在之外,我根本找不到有关该速率限制的更多信息……结果,这使我们的软件非常无法使用。目前,我唯一能做的就是以 API 28 为目标,但谷歌不希望这种情况持续太久。

我还发现这个线程上的一些信息对上面的代码非常有用。requestCellInfoUpdate() 的正确用法是什么?

任何帮助或建议将不胜感激。

亨利

4

0 回答 0