1. ホーム
  2. アンドロイド

[解決済み】デバイスを振ったときにアプリを更新するには?

2022-04-04 15:26:53

質問

Androidアプリケーションを更新するために、シェイク機能を追加する必要があります。

ドキュメントを探しても SensorListener しかし、Eclipse はそれが非推奨であり SensorEventListener .

このようなものを作るにはどうしたらいいか、いいガイドをお持ちの方はいらっしゃいませんか? shake controller ?

解決方法は?

以下はコード例です。 これをアクティビティクラスに記述してください。

  /* 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();
  }

そして、これをonCreateメソッドに追加してください。

    /* 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;

そして、アプリケーションの好きな場所で、軸から独立した、重力のような静的加速度からクリーンな現在の加速度を "mAccel" に問い合わせることができます。 この値は、何も動いていなければ約0、デバイスが揺れている場合は例えば2です。

コメントに基づいて - これをテストするために。

if (mAccel > 12) {
    Toast toast = Toast.makeText(getApplicationContext(), "Device has shaken.", Toast.LENGTH_LONG);
    toast.show();
}

注意事項

加速度センサーを無効にする必要があります オンポーズ を起動し オンレジューム CPUやバッテリーのリソースを節約するためです。 このコードでは、私たちが地球上にいると仮定して、加速度を地球の重力に初期化します。そうしないと、アプリケーションが起動し、自由落下から地面に衝突したときに、強い揺れを感じることになります。しかし、このコードはローカットフィルターによる重力に慣れるので、一度初期化すれば他の惑星や自由空間でも動作するようになります。 (アプリケーションはいつまで使われるかわからないですからね...。)