【问题标题】:Cannot override Java function in Kotlin无法覆盖 Kotlin 中的 Java 函数
【发布时间】:2018-10-11 12:17:39
【问题描述】:

我目前正在使用 Kotlin 开发面向 API 27 的支持 BLE 的 Android 应用。

我正在尝试覆盖android.bluetooth.BluetoothGatt 中的一个函数。有许多回调可被覆盖以启用某些 BLE 事件的处理。

例如,我通过以下方式覆盖onConnectionStateChange()

private val bluetoothGattCallback = object : BluetoothGattCallback() {

    override fun onConnectionStateChange(gatt: BluetoothGatt, status: Int, newState: Int) {
        /* do stuff */
    }

这很好用。

我的问题源于试图覆盖 onConnectionUpdated()。这个回调的定义方式和BLE API source中的onConnectionStateChange()一样,那我怎么不能覆盖呢?这就是我试图覆盖它的方式(仍在BluetoothGattCallback() 对象内):

fun onConnectionUpdated(gatt: BluetoothGatt, interval: Int, latency: Int, timeout: Int, status: Int) {
    /* do stuff */
}

编辑:我忘了提到,当我添加 override 关键字时,它会提供错误消息:OnConnectionUpdated overrides nothing.

原谅我的幼稚,我不经常使用 Kotlin/Java,谢谢。

【问题讨论】:

  • 究竟是什么阻止您覆盖该方法?另外,在您的示例中,我看到一个错字:fun onConnectionUpdate 而不是 fun onConnectionUpdated
  • 忘记了override关键字?
  • 我已更正错字。我应该提到,当我添加 override 关键字时,它只是说 onConnectionUpdated overrides nothing
  • 因为BluetoothGattCallback一开始就没有这样的功能。 developer.android.com/reference/android/bluetooth/…
  • @AlexanderAgeychenko 但它在源代码中可用,为什么我无法访问它?

标签: java android kotlin bluetooth-lowenergy


【解决方案1】:

您不应使用此方法,它仅供内部使用,而不是公共 API 的一部分。因此它通过@hide 隐藏。有关@hide 以及如何访问它的更多信息,请参阅What does @hide mean in the Android source code?

请注意,使用反射来访问它,如上面链接中所述is discouraged

您要使用的方法是在dark-greylist 上使用以下restrictions

深灰名单

  • 对于目标 SDK 低于 API 级别 28 的应用程序:每次使用黑暗
    允许使用灰名单接口。
  • 目标 SDK 为 API 级别 28 或更高级别的应用:与黑名单行为相同

黑名单:不受目标 SDK 限制。平台的行为就像没有接口一样。例如,当应用程序尝试使用它时,它会抛出 NoSuchMethodError/NoSuchFieldException,当应用程序想知道特定类的字段/方法列表时,它不会包含它。

【讨论】:

  • 感谢您解释为什么它不可用。有 any 方法可以访问连接间隔吗?在这种情况下,Android 设备是中心设备,而它所连接的外围设备则取决于知道连接间隔。没有办法在外围端读取这个值,所以真的有no方法可以在中心端访问这个常量吗?
  • 啊,我明白了。反射。谢谢。
  • 所有最好的东西都有@hide .. :( 小心通过反射使用这些,AOSP 中的许多实现使用检查调用进程是否有权这样做.. 在这里可能没问题,但只是需要注意的事情。
  • 我仍然没有运气使用反射来访问函数,任何指针?
  • 你得到了很好的答案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-15
  • 2018-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-18
相关资源
最近更新 更多