web-dev-qa-db-ja.com

getOrientation()関数を使用してデバイスの角度を取得する

_Sensor.TYPE_ORIENTATION_を使用してデバイスの現在の角度を決定していましたが、_TYPE_ORIENTATION_はAPIバージョン8では非推奨です。 SensorManagerマニュアルでは、_TYPE_ORIENTATION_を使用するためにgetOrientation()関数を参照しています。

これがマニュアルです


これが私の古いコードです:

_public void onSensorChanged(SensorEvent event) {
        Log.d("debug","Sensor Changed");
        if (event.sensor.getType()==Sensor.TYPE_ORIENTATION) {
            Log.d("debug",Float.toString(event.values[0]));


            float mAzimuth = event.values[0];
            float mPitch = event.values[1];
            float mRoll = event.values[2];

            Log.d("debug","mAzimuth :"+Float.toString(mAzimuth));
            Log.d("debug","mPitch :"+Float.toString(mPitch));
            Log.d("debug","mRoll :"+Float.toString(mRoll));
        }

    }
_

getOrientation()関数の使用について本当に混乱しています。角度を取得する方法の例を誰かに教えてもらえますか?

12
fobus

2つのセンサー(ACCELEROMETERとMAGNETIC_FIELD)を使用して、その情報を取得します。詳細については、 ブログ投稿を参照してください。

public class CompassActivity extends Activity implements SensorEventListener {

  private SensorManager mSensorManager;
  Sensor accelerometer;
  Sensor magnetometer;

  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(mCustomDrawableView);    // Register the sensor listeners
    mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
    accelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    magnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
  }

  protected void onResume() {
    super.onResume();
    mSensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_UI);
    mSensorManager.registerListener(this, magnetometer, SensorManager.SENSOR_DELAY_UI);
  }

  protected void onPause() {
    super.onPause();
    mSensorManager.unregisterListener(this);
  }

  public void onAccuracyChanged(Sensor sensor, int accuracy) {  }

  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];
      boolean success = SensorManager.getRotationMatrix(R, I, mGravity, mGeomagnetic);
      if (success) {
        float orientation[] = new float[3];
        SensorManager.getOrientation(R, orientation);
        azimut = orientation[0]; // orientation contains: azimut, pitch and roll
      }
    }
  }
}

権限:

<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION"/>
27
JRomero

2番目の質問について。センサーリスナーを登録するときに、コードを次のように変更します。

protected void onResume() {          
    super.onResume();          
    mSensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);          
    mSensorManager.registerListener(this, magnetometer, SensorManager.SENSOR_DELAY_NORMAL);          
}
3
Shaheed

Googleの TiltSpot と呼ばれるgoogle-developer-trainingシリーズには、オリエンテーションのための優れたデモアプリがあります。これはApacheライセンスを持っているので、自由に johnnylambada-orientation と呼ばれる小さなライブラリに変換しました。

        getLifecycle().addObserver(new OrientationReporter(this, (a, p, r) -> {
            Log.i("orientation","a="+a+" p="+p+" r="+r);
        }));
1
JohnnyLambada