Kotlin/Native 在 Android 特定部分访问设备传感器
Kotlin/Native access device sensor in Android specific part
我目前被困在一项我认为很基本的任务上。 I\m 在 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 特定部分更好?
我想应该是这样的;
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)
如果您真的希望它作为 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/Native 编译为 iOS 并通过常规 Kotlin 到 Android,使用 "kotlin-multiplatform" gradle 插件。
我目前被困在一项我认为很基本的任务上。 I\m 在 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 特定部分更好?
我想应该是这样的;
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)
如果您真的希望它作为 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/Native 编译为 iOS 并通过常规 Kotlin 到 Android,使用 "kotlin-multiplatform" gradle 插件。