3

次のようにコードを実装しました。

    //register sensor in OnResume
    mSensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_UI);
    mSensorManager.registerListener(this, magnetometer, SensorManager.SENSOR_DELAY_UI);

    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);

            azimuth = (int)( Math.toDegrees( orientation[0] ) + 0.5 );    // orientation contains: azimuth, pitch and roll
            pitch = (int)( Math.toDegrees( orientation[1] ) + 0.5 );
            roll = (int)( Math.toDegrees( orientation[2] ) + 0.5 );

            // output azimuth, pitch and roll
        }
    }
}

上記のコードは、Galaxy Nexus セルでは正常に動作しますが、nexus タブレットでは問題があります (方位角、ピッチ、ロールの更新がうまく応答せず、5 ~ 8 秒かかる場合があります)。

OnSensorChanged() の呼び出しが正常に機能していることを確認しましたが、「if(success)」テストが常に成功するとは限らず、この問題が発生します。

ブール変数「成功」を出力してテストしました:

  • Galaxy Nexus では、false と true の比率は約 1:1 です。
  • Nexus タブレットでは、false と true の比率が大きく異なり、20 : 1 を超えることもあります。

どんな助けでも大歓迎です。

4

2 に答える 2

0

SensorEventsの固定プールがあり、それらのデータを直接使用している場合は、下から変更できる可能性がありますが、クローンを作成することで、いつでもそのデータを利用できます。

于 2012-10-14T15:04:42.347 に答える