onSensorChanged(SensorEvent event)始终显示相同的结果



我测试了指南针应用程序的源代码。 这个应用程序已经安装在姜饼和果冻爆炸上。 问题是我的指南针应用程序在果冻胚芽中不起作用,但在姜饼中运行良好。

问题是如果我记录"event.values[0]",它总是显示相同的结果

这是我的代码

package com.example.compassapp;
import android.app.Activity;
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.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;
import android.widget.TextView;
public class MainActivity extends Activity implements SensorEventListener {
// define the display assembly compass picture
private ImageView image;
// record the compass picture angle turned
private float currentDegree = 0f;
// device sensor manager
private SensorManager mSensorManager;
TextView tvHeading;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    // 
    image = (ImageView) findViewById(R.id.imageViewCompass);
    // TextView that will tell the user what degree is he heading
    tvHeading = (TextView) findViewById(R.id.tvHeading);
    // initialize your android device sensor capabilities
    mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    mSensorManager.registerListener(this,mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),
            SensorManager.SENSOR_DELAY_GAME);
}
@Override
protected void onResume() {
    super.onResume();
    // for the system's orientation sensor registered listeners
    mSensorManager.registerListener(this,   mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),
            SensorManager.SENSOR_DELAY_GAME);
}
@Override
protected void onPause() {
    super.onPause();
    Log.i("aa", "pause");
    // to stop the listener and save battery
    mSensorManager.unregisterListener(this);
}
@Override
public void onSensorChanged(SensorEvent event) {
    synchronized (this) {
        Log.i("aa", event.values[0]+"");
    // get the angle around the z-axis rotated
    float degree = Math.round(event.values[0]);
    tvHeading.setText("Heading: " + Float.toString(degree) + " degrees");
    // create a rotation animation (reverse turn degree degrees)
    RotateAnimation ra = new RotateAnimation(
            currentDegree, 
            -degree,
            Animation.RELATIVE_TO_SELF, 0.5f, 
            Animation.RELATIVE_TO_SELF,
            0.5f);
    // how long the animation will take place
    ra.setDuration(210);
    // set the animation after the end of the reservation status
    ra.setFillAfter(true);
    // Start the animation
    image.startAnimation(ra);
    currentDegree = -degree;
    }
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
    // not in use
}
}

有人可以解释为什么会发生这种情况吗?

因为type_orientation传感器在Android 4.0.3及更高版本中已弃用。

对于高于 4.0.3 的版本,您必须使用 Sensor.TYPE_ACCELEROMETERSensor.TYPE_MAGNETIC_FIELD

  accelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
  magnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);

并获取您的值传感器已更改:

float[] mGravity;
 float[] mGeomagnetic;
 public void onSensorChanged(SensorEvent event) {
  if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
   mGravity = event.values;
  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];
   /*Computes the inclination matrix I as well as the rotation matrix R transforming a vector from the device coordinate
    *  system to the world's coordinate system which is defined as a direct orthonormal basis*/
   boolean success = SensorManager.getRotationMatrix(R, I, mGravity, mGeomagnetic);
   if (success) {
    float orientation[] = new float[3];
    /*Computes the device's orientation based on the rotation matrix*/
    SensorManager.getOrientation(R, orientation);
    azimut = orientation[0]; // orientation contains: azimut, pitch and roll
   }
  }
  mCustomDrawableView.invalidate();
 }

有关高于 4.0.3 版本的 Compass 的基本代码片段,请参阅此处。

最新更新