Датчик Kotlin / Native access device в специфической части Android - PullRequest
0 голосов
/ 19 ноября 2018

В настоящее время я застрял на задаче, которая, на мой взгляд, довольно проста.Я разрабатываю библиотеку в 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?Или лучше в специфичной для Android части Kotlin / Native?

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Если вы действительно хотите использовать его как библиотеку Kotlin / Native на Android - у нее будет прямой доступ к 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, используя плагин grad "kotlin-multiplatform".

0 голосов
/ 19 ноября 2018

Я думаю, это было бы что-то вроде:

 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)
...