java - 为什么我的 SensorEventListener 实现不起作用?没有收到 onSensorChanged 回调

标签 java android android-sensors sensormanager

我正在尝试制作一个应用来以度数显示手机旋转,但没有调用 onSensorChanged。 textView 中的文本没有改变,我不知道为什么。它不会给出任何编译错误。这是代码。

package com.alex.location360;

import androidx.appcompat.app.AppCompatActivity;

import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements SensorEventListener  {

    TextView textView;
    float roll=0;
    @Override
    public void onSensorChanged(SensorEvent event) {
        float[] mGravity = new float[0];
        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
            mGravity = event.values;

        float[] mGeomagnetic = new float[0];
        if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
            mGeomagnetic = event.values;

        if (mGravity != null && mGeomagnetic != null) {
            float R[] = new float[9];
            float I[] = new float[9];

            boolean success = SensorManager.getRotationMatrix(R, I, mGravity, mGeomagnetic);
            if (success) {
                float orientation[] = new float[3];
                SensorManager.getOrientation(R, orientation);
                float azimuth = orientation[0]; // orientation contains: azimuth, pitch and roll
                float pitch = orientation[1];
                roll = orientation[2];
                roll= (float) Math.toDegrees(roll);
                textView.setText(String.valueOf(roll));
                Log.e("#",String.valueOf(roll));
            }
        }
    }
    @Override
    public void onAccuracyChanged(Sensor sensor, int i) {

    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView=findViewById(R.id.textView);
    }
}

最佳答案

您需要实际订阅传感器更新,而不是简单地实现 SensorEventListener

将此添加到您的 onCreate 方法中:

SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
accelerometerSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
magneticFieldSensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
sensorManager.registerListener(this, accelerometerSensor, SensorManager.SENSOR_DELAY_NORMAL);
sensorManager.registerListener(this, magneticFieldSensor, SensorManager.SENSOR_DELAY_NORMAL);

您可能还想取消订阅 onDestroy 中的监听器(或者使用 onStart/onStop 如果您只想在 Activity 可见。

关于java - 为什么我的 SensorEventListener 实现不起作用?没有收到 onSensorChanged 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63188169/

相关文章:

java - Java技术中是否有任何XmlIgnoreAttribute或等价物

java - 将 cron 表达式从一个时区转换为另一时区

android - 如何解决 'sdk manager path not recognized as an internal or external command' 错误?

java - 使用支持库导出 Android 项目时出现 ProGuard 错误

android - Activity 在一段时间后停止接收陀螺仪传感器值

java - 在 Android 上,Java 可以调用 JNI,然后 JNI 调用回 Java 吗?

javascript - mobx @observable 在旧版 Android 4.4 平板电脑上抛出错误

java - android OnSensorChanged() 响应慢

java - Android 加速度计是毫秒还是微秒?

java - RabbitMQ Spring AMQP - 一段时间后的消息处理