質問

i tested source code for compass app. this app have installed on ginger bread and jelly blast. the problem is my compass app not work in jellyblast but in gingerbread work well.

the problem is if i log the "event.values[0]" it's always show same result

this is my code

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
}
}

can somebody explain why this happen?

役に立ちましたか?

解決

because type_orientationsensor is deprecated for the android 4.0.3 and above versions.

you have to use Sensor.TYPE_ACCELEROMETER and Sensor.TYPE_MAGNETIC_FIELD for version greater than 4.0.3 :

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

and get you values 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();
 }

see here for basic code snippet on compass in version greater that 4.0.3.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top