Java 为什么';我的SensorEventListener实现没有工作吗?未接收onSensorChanged回调

Java 为什么';我的SensorEventListener实现没有工作吗?未接收onSensorChanged回调,java,android,android-sensors,sensormanager,Java,Android,Android Sensors,Sensormanager,我正在尝试制作一个应用程序来显示手机的旋转度,但onSensorChanged没有被呼叫。文本视图中的文本没有改变,我不知道为什么。它没有给出任何编译错误。这是代码 package com.alex.location360; import androidx.appcompat.app.AppCompatActivity; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.ha

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

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\u SERVICE);
ACCELEROMETER传感器=sensorManager.getDefaultSensor(传感器.类型\加速计);
magneticFieldSensor=sensorManager.getDefaultSensor(传感器类型\磁场);
sensorManager.registerListener(此为加速度计传感器,sensorManager.SENSOR\u DELAY\u NORMAL);
sensorManager.registerListener(这是磁场传感器,sensorManager.SENSOR\u延迟\u正常);

您可能还想取消订阅
onDestroy
(如果您只想在活动可见时更新,请使用
onStart
/
onStop

在传感器上设置断点。如果传感器正在运行,请在oncreate中检查,您可以在代码中手动设置textview。
textview.setTest(“这行吗?”)
还有if success和else with a log语句,以查看ti是否在logcat中工作。@ThomasMorris sensorChanged根本无法访问。好的,我建议您查看文档以了解如何使用它。您在哪里声明传感器。您的传感器也需要权限。对于加速,您可能需要权限,请参阅:我添加了这一点,但nuw应用程序因以下错误而崩溃。java.lang.ArrayIndexOutOfBoundsException:length=0;android.hardware.SensorManager.getRotationMatrix(SensorManager.java:1195)这意味着它修复了您的问题,因为它现在正在获取更新回调。它崩溃是因为您的
mGravity
mGeomagnetic
数组正在初始化为空数组,但您在使用它们之前检查它们是否为
null
。使
float[]mGravity
float[]mGeomagnetic
活动的两个实例变量(将它们移出方法),并将它们初始化为
null
,而不是
new float[0]
。如果您还有任何问题,请随时提出新的堆栈溢出问题。