【问题标题】:onSensorChanged(SensorEvent event) always show the same resultonSensorChanged(SensorEvent event) 总是显示相同的结果
【发布时间】:2016-01-15 08:00:32
【问题描述】:

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

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


    【解决方案1】:

    因为type_orientationsensor 已被 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);
    

    并让您获得 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();
     }
    

    请参阅here,了解 4.0.3 以上版本中指南针上的基本代码 sn-p。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-13
      • 2022-01-14
      • 1970-01-01
      相关资源
      最近更新 更多