![](/img/trans.png)
[英]How to take a picture when motion is detected using ACCELEROMETER sensor
[英]Kotlin using Motion sensor
我試圖弄清楚使用Kotlin的運動傳感器如何工作。 我想做些什么,如果電話打開了,糾正了,如果電話關閉了,錯了。 我已經看過教程,但仍然無法弄清楚。 以下是我嘗試過的代碼。
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.content.Context
import android.hardware.Sensor
import android.hardware.SensorEvent
import android.hardware.SensorEventListener
import android.hardware.SensorManager
class MainActivity : AppCompatActivity(), SensorEventListener {
private lateinit var sensorManager: SensorManager
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
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
}
sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE)?.let {
this.gyroscope = it
}
sensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION)?.let {
this.linearAcceleration = it
}
sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR)?.let {
this.rotationVector = it
}
}
override fun onSensorChanged(event: SensorEvent?) {
when (event?.sensor?.type) {
Sensor.TYPE_LINEAR_ACCELERATION -> {
valuesLinAcceleration[0] = event.values[0]
valuesLinAcceleration[1] = event.values[1]
valuesLinAcceleration[2] = event.values[2]
this.binding.tvLinearAccelX.text = event.values[0].formatValue()
this.binding.tvLinearAccelY.text = event.values[1].formatValue()
this.binding.tvLinearAccelZ.text = event.values[2].formatValue()
}
Sensor.TYPE_GRAVITY -> {
valuesGravity[0] = event.values[0]
valuesGravity[1] = event.values[1]
valuesGravity[2] = event.values[2]
this.binding.tvGravity.text = event.values[0].formatValue()
this.binding.tvGravityY.text = event.values[1].formatValue()
this.binding.tvGravityZ.text = event.values[2].formatValue()
}
Sensor.TYPE_ACCELEROMETER -> {
val alpha = 0.8f
accelGravity[0] = alpha * accelGravity[0] + (1 - alpha) * event.values[0]
accelGravity[1] = alpha * accelGravity[1] + (1 - alpha) * event.values[1]
accelGravity[2] = alpha * accelGravity[2] + (1 - alpha) * event.values[2]
accelLin[0] = event.values[0] - accelGravity[0]
accelLin[1] = event.values[1] - accelGravity[1]
accelLin[2] = event.values[2] - accelGravity[2]
this.binding.tvAccelerometerX.text = accelLin[0].formatValue()
this.binding.tvAccelerometerY.text = accelLin[1].formatValue()
this.binding.tvAccelerometerZ.text = accelLin[2].formatValue()
}
Sensor.TYPE_GYROSCOPE -> {
valuesGyroscope[0] = event.values[0]
valuesGyroscope[1] = event.values[1]
valuesGyroscope[2] = event.values[2]
this.binding.tvGyroscope.text = event.values[0].formatValue()
this.binding.tvGyroscopeY.text = event.values[1].formatValue()
this.binding.tvGyroscopeZ.text = event.values[2].formatValue()
}
Sensor.TYPE_ROTATION_VECTOR -> {
valuesRotation[0] = event.values[0]
valuesRotation[1] = event.values[1]
valuesRotation[2] = event.values[2]
this.binding.tvRotationVector.text = event.values[0].formatValue()
this.binding.tvRotationVectorY.text = event.values[1].formatValue()
this.binding.tvRotationVectorZ.text = event.values[2].formatValue()
}
}
}
override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {
}
}
似乎缺少了一些東西,如果你們能指出正確的方向或正確的方法,那將非常有幫助。 謝謝
您沒有為傳感器注冊任何偵聽器,因此您將永遠不會獲得任何更新。
您可以通過以下方式注冊偵聽器:
protected void onResume() {
super.onResume();
sensorManager.registerListener(this, this.accelerometer, SensorManager.SENSOR_DELAY_NORMAL);
// repeat that line for each sensor you want to monitor
}
...
protected void onPause() {
super.onPause();
sensorManager.unregisterListener(this);
}
您可以根據使用情況使用不同的采樣周期。 檢查在SensorManager中定義的常量,以發現更適合您的參數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.