微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Android TelephonyManager requestCellInfoUpdate 在 API 29

如何解决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 举报,一经查实,本站将立刻删除。