Как точно определить уровень дрожания на всех android устройствах? - PullRequest
1 голос
/ 27 января 2020

Я хочу выполнить определенную задачу, когда сотрясение обнаруживается акселерометром, но проблема в том, что уровень чувствительности каждого устройства отличается. Например: посмотрите на этот код на датчике, измененном `

public void onSensorChanged(SensorEvent event) {

    float[] values = event.values;
    // Movement
    float x = values[0];
    float y = values[1];
    float z = values[2];
    //formula
    float accelationSquareRoot = ((x * x + y * y + z * z)
            / (SensorManager.GRAVITY_EARTH * SensorManager.GRAVITY_EARTH));
    float acc = accelationSquareRoot - 1;
    String s1 = String.valueOf(acc);
    //if I used a value 10 instead of 7 below it will be fine for samsung 
    phones but will not work on most nokia phones
    if (acc >= 7){//perform certain task} }

Для моего Nokia 6.1 обнаружение сотрясений составляет от 1 до 10, а если значение больше 10, ничего не будет обнаружено, для Samsung Galaxy Note7, уровень обнаружения составляет от 1 до 30, что означает, что оборудование каждого производителя немного отличается от других. Если я установлю значение 7, мне придется сильно встряхнуть на моем Nokia 6.1, но на телефонах Samsung значение 7 считается очень низкой чувствительностью, и код будет работать даже при касании телефона. Я хочу, чтобы пользователь имел различные android устройства для установки желаемого уровня чувствительности, например, малого, среднего и жесткого. Что я должен сделать, чтобы запустить это на устройствах почти 1300 брендов с более чем 24 000 различных android устройств?

1 Ответ

0 голосов
/ 27 января 2020

Пожалуйста, попробуйте этот способ,

import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.Toast;
import java.util.Objects;
public class MainActivity extends AppCompatActivity {
   private SensorManager mSensorManager;
   private float mAccel;
   private float mAccelCurrent;
   private float mAccelLast;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
      Objects.requireNonNull(mSensorManager).registerListener(mSensorListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
      SensorManager.SENSOR_DELAY_NORMAL);
      mAccel = 10f;
      mAccelCurrent = SensorManager.GRAVITY_EARTH;
      mAccelLast = SensorManager.GRAVITY_EARTH;
   }
   private final SensorEventListener mSensorListener = new SensorEventListener() {
      @Override
      public void onSensorChanged(SensorEvent event) {
         float x = event.values[0];
         float y = event.values[1];
         float z = event.values[2];
         mAccelLast = mAccelCurrent;
         mAccelCurrent = (float) Math.sqrt((double) (x * x + y * y + z * z));
         float delta = mAccelCurrent - mAccelLast;
         mAccel = mAccel * 0.9f + delta;
         if (mAccel > 12) {
            Toast.makeText(getApplicationContext(), "Shake event detected", Toast.LENGTH_SHORT).show();
         }
      }
      @Override
      public void onAccuracyChanged(Sensor sensor, int accuracy) {
      }
   };
   @Override
   protected void onResume() {
      mSensorManager.registerListener(mSensorListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
      SensorManager.SENSOR_DELAY_NORMAL);
      super.onResume();
   }
   @Override
   protected void onPause() {
      mSensorManager.unregisterListener(mSensorListener);
      super.onPause();
   }
}
...