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 的刷新。相反,这些应用程序将收到最新的缓存结果,这些结果可能不是最新的。希望请求更新 CellInfo 的面向 Android 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 = cellInfo.timeStamp // This value determines the age of the data.
        }
    }
})

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

我还发现该线程上的一些信息对执行上面的代码非常有用。 What is proper usage of requestCellInfoUpdate()?

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

亨利

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)