Skip to content

传感器

源:Android Sensor | iOS CoreMotion

设备传感器提供加速度、陀螺仪、磁力计等数据。本文展示传感器的基础使用。

平台差异对比

平台原生 API常用传感器权限要求
AndroidSensorManager加速度、陀螺仪、光线、距离等无需权限
iOSCoreMotion加速度、陀螺仪、磁力计无需初学权限
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 设置。根据实际需求选择合适的采样率以平衡性能和电量。