Как обновить приложение после сотрясения устройства?

Я должен добавить опцию встряски, которая обновит мое приложение Android.

Все, что я нахожу документации, включает реализацию SensorListener, но Eclipse говорит мне, что удерживается от использования, и предложить SensorEventListener.

Кто-либо, который имеет хорошее руководство по тому, как я иду о создании этого shake controller?

250
задан itsmysterybox 7 October 2018 в 17:57
поделиться

2 ответа

Вот пример кода. Поместите это в свой класс активности:

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

Примечания:

Акселерометр должен быть отключен onPause и активирован onResume для экономии ресурсов (ЦП, батарея). Код предполагает, что мы находимся на планете Земля ;-) и инициализирует ускорение земного притяжения. В противном случае вы получите сильную "тряску", когда приложение запустится и "упадет" на землю от свободного падения. Однако код привыкает к гравитации из-за фильтра низких частот и будет работать также на других планетах или в свободном космосе после инициализации. (вы никогда не знаете, как долго ваше приложение будет использоваться ...; -)

314
ответ дан 23 November 2019 в 02:56
поделиться

Вы должны подписаться как SensorEventListener и получить данные акселерометра . После того, как вы Имея его, вы должны следить за внезапным изменением направления (знака) ускорения на определенной оси. Это было бы хорошим показателем для «встряхивания» устройства.

2
ответ дан 23 November 2019 в 02:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: