【问题标题】:Kotlin/Native access device sensor in Android specific partAndroid 特定部分中的 Kotlin/Native 访问设备传感器
【发布时间】:2018-11-19 13:41:29
【问题描述】:

我目前被困在一项我认为非常基本的任务上。我正在使用 Kotlin/Native 开发一个库,该库应该查询 iOS 和 Android 中的重力传感器。

几乎所有的逻辑都在公共部分,只有与设备传感器的通信是在平台特定的方法中实现的。令人惊讶的是,所有 iOS 核心库(在本例中为 CoreMotion)都已被移植,因此实现起来非常容易。

CoreMotion 在这种情况下允许我在重力传感器上添加一个侦听器,只要屏幕的方向相对于 X、Y 或 Z 发生变化(我对 Z 感兴趣),它就会调用回调函数

在 Android 中我会做这样的事情

private lateinit var sensorManager: SensorManager

fun setupSensor() {

    this.sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager

    sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)?.let {
        this.accelerometer = it
    }
    sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY)?.let {
        this.gravity = it
    } 

}

但所需的导入在 Kotlin/Native 中不可用

import android.hardware.Sensor;
import android.hardware.SensorManager;

有没有办法在 Kotlin/Native 中访问这种硬件(重力传感器)?还是在 Kotlin/Native 的 Android 特定部分更好?

【问题讨论】:

  • 你能问一个更具体的问题吗?你想使用什么传感器,你想用它们做什么?
  • 我需要上面所说的重力传感器。具体来说,我需要它的 Z 值来判断屏幕是朝上、朝下还是介于两者之间……我会更新问题

标签: android kotlin cross-platform kotlin-native


【解决方案1】:

如果您真的希望它作为 Android 上的 Kotlin/Native 库 - 它可以直接访问 Android NDK,而不是 SDK。

因此对于传感器,它可以使用来自 https://android.googlesource.com/platform/frameworks/native/+/jb-dev/include/android/sensor.h

在 Kotlin/Native 中,这些函数在包 platform.android.* 中提供

但是,如果您只想让您的库在 iOS 和 Android 中都可用 - 更简单和常见的方法是使用“kotlin-multiplatform”gradle 插件将 Kotlin/Native 编译到 iOS 和常规 Kotlin 到 Android 编译相同的源代码.

【讨论】:

  • 谢谢这是正确的提示!最后我只是在 Android 部分有一个配置错误,所以我无法访问/导入 android 特定部分......不幸的是官方指南(kotlinlang.org/docs/tutorials/native/…)在这里有点误导,但从@获取相关部分987654323@解决了。
【解决方案2】:

我想应该是这样的;

 val sensorManager: SensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager

            sensorManager.registerListener(object : SensorEventListener {
                override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {
                    //Not needed
                }

                override fun onSensorChanged(event: SensorEvent?) {
                    if (event?.sensor?.type == Sensor.TYPE_GRAVITY) {
                        System.out.println("X: " + event.values[0])
                        System.out.println("Y: " + event.values[1])
                        System.out.println("Z: " + event.values[2])
                    }
                }
            }, sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY), Sensor.TYPE_GRAVITY)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多