我测试了罗盘应用程序的源代码。这个程序已经安装在生姜面包和果冻爆炸。问题是我的指南针应用程序不能在果冻中工作,但在姜饼中能很好地工作。

问题是,如果我记录“ 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
}
}


有人可以解释为什么会这样吗?

最佳答案

因为android 4.0.3及更高版本不推荐使用type_orientation sensor。

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

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


并在onSensorChanged上获取值:

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的指南针的基本代码段,请参见here

10-07 18:41