1

Android アプリで線形加速度フュージョン センサーを使用しようとしています。ただし、Sensor.TYPE_LINEAR_ACCELERATION のセンサーが見つかりません。

私はこれらの呼び出しを実行します:

mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mLinearAcceleration = mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION);

上記の後、mAccelerometer が定義されますが、mLinearAcceleration は null です。TYPE_LINEAR_ACCELERATION が API レベル 9 まで追加されなかったことは知っていますが、少なくとも API レベル 9 で実行していると思います。マニフェスト ファイルのスニペットを次に示します。

<uses-sdk
android:minSdkVersion="9"
android:targetSdkVersion="17" />

したがって、正しい API レベルで作業していると思います。

ただし、使用可能なすべてのセンサーをリストしようとすると、この API レベルで使用できるはずのすべてのセンサーが見つかりません。

電話したら…

List<Sensor> l = mSensorManager.getSensorList(Sensor.TYPE_ALL);
for(Sensor s : l)
    System.out.println(s.getName());

私は得る

Goldfish 3-axis Accelerometer
Goldfish 3-axis Magnetic field sensor
Goldfish Orientation sensor
Goldfish Temperature sensor
Goldfish Proximity sensor

これらはいずれも線形加速度ではなく、1 つは非推奨のセンサーである方向です。私のセンサーは API レベル 9 以前のもののように動作しているように見えますが、その理由はわかりません。私のプロジェクトには、アプリを古い API として機能させる可能性のあるフィールドはありますか? (既に 9 に設定されている、AndroidManifest.xml ファイルの最小サポート API フィールドを除く)

4

1 に答える 1

1

これをマニフェストに入れます

<uses-permission android:name=”android.permission.SET_ORIENTATION” />

加速度計にアクセスするためのものです

これを試して:

     /* put this into your activity class */
  private SensorManager mSensorManager;
  private float mAccel; // acceleration apart from gravity
  private float mAccelCurrent; // current acceleration including gravity
  private float mAccelLast; // last acceleration including gravity

  private final SensorEventListener mSensorListener = new SensorEventListener() {
public void onSensorChanged(SensorEvent se) {
  float x = se.values[0];
  float y = se.values[1];
  float z = se.values[2];
  mAccelLast = mAccelCurrent;
  mAccelCurrent = (float) Math.sqrt((double) (x*x + y*y + z*z));
  float delta = mAccelCurrent - mAccelLast;
  mAccel = mAccel * 0.9f + delta; // perform low-cut filter
}

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

  @Override
  protected void onResume() {
    super.onResume();
    mSensorManager.registerListener(mSensorListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
  }

  @Override
  protected void onPause() {
    mSensorManager.unregisterListener(mSensorListener);
    super.onPause();
  }

この:

 /* do this in onCreate */
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensorManager.registerListener(mSensorListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
mAccel = 0.00f;
mAccelCurrent = SensorManager.GRAVITY_EARTH;
mAccelLast = SensorManager.GRAVITY_EARTH;
于 2013-03-19T06:57:25.430 に答える