Android特定部分中的Kotlin /本机访问设备传感器

时间:2018-11-19 13:41:29

标签: android kotlin cross-platform kotlin-native

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

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

在这种情况下,CoreMotion允许我在重力传感器上添加侦听器,每当屏幕的方向相对于X,Y或Z改变(我对Z btw感兴趣)时,该侦听器就会调用回调

在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特定部分更好?

2 个答案:

答案 0 :(得分:1)

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

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

在Kotlin / Native中,这些功能在软件包{{1}}中可用

但是,如果您只想使您的库在iOS和Android中都可用-更简单和常见的方式是使用“ kotlin-multiplatform” gradle插件,将Kotlin / Native编译为iOS,将常规Kotlin编译为Android

答案 1 :(得分:0)

我想那会是这样的

 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)