传感器
源:Android Sensor | iOS CoreMotion
设备传感器提供加速度、陀螺仪、磁力计等数据。本文展示传感器的基础使用。
平台差异对比
| 平台 | 原生 API | 常用传感器 | 权限要求 |
|---|---|---|---|
| Android | SensorManager | 加速度、陀螺仪、光线、距离等 | 无需权限 |
| iOS | CoreMotion | 加速度、陀螺仪、磁力计 | 无需初学权限 |
| Desktop | - | - | 无标准支持 |
标准代码块
kotlin
data class AccelerometerData(
val x: Float,
val y: Float,
val z: Float,
val timestamp: Long
)
expect class SensorManager {
fun startAccelerometer(callback: (AccelerometerData) -> Unit)
fun stopAccelerometer()
}kotlin
import android.content.Context
import android.hardware.Sensor
import android.hardware.SensorEvent
import android.hardware.SensorEventListener
import android.hardware.SensorManager as AndroidSensorManager
actual class SensorManager(context: Context) {
private val sensorManager = context.getSystemService(Context.SENSOR_SERVICE)
as AndroidSensorManager
private var accelerometer: Sensor? = null
private var listener: SensorEventListener? = null
init {
accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
}
actual fun startAccelerometer(callback: (AccelerometerData) -> Unit) {
listener = object : SensorEventListener {
override fun onSensorChanged(event: SensorEvent) {
val data = AccelerometerData(
x = event.values[0],
y = event.values[1],
z = event.values[2],
timestamp = event.timestamp
)
callback(data)
}
override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) {}
}
accelerometer?.let {
sensorManager.registerListener(
listener,
it,
AndroidSensorManager.SENSOR_DELAY_NORMAL
)
}
}
actual fun stopAccelerometer() {
listener?.let { sensorManager.unregisterListener(it) }
listener = null
}
}kotlin
import platform.CoreMotion.*
actual class SensorManager {
private val motionManager = CMMotionManager()
actual fun startAccelerometer(callback: (AccelerometerData) -> Unit) {
if (motionManager.accelerometerAvailable) {
motionManager.startAccelerometerUpdatesToQueue(
NSOperationQueue.mainQueue
) { data, error ->
data?.let {
val accelerometerData = AccelerometerData(
x = it.acceleration.x.toFloat(),
y = it.acceleration.y.toFloat(),
z = it.acceleration.z.toFloat(),
timestamp = System.currentTimeMillis()
)
callback(accelerometerData)
}
}
}
}
actual fun stopAccelerometer() {
motionManager.stopAccelerometerUpdates()
}
}kotlin
actual class SensorManager {
actual fun startAccelerometer(callback: (AccelerometerData) -> Unit) {}
actual fun stopAccelerometer() {}
}传感器采样率
Android 提供多种采样率(FASTEST、GAME、UI、NORMAL),iOS 通过 updateInterval 设置。根据实际需求选择合适的采样率以平衡性能和电量。