очень низкая частота опроса датчиков - PullRequest
0 голосов
/ 30 марта 2019

Я читаю необработанное ускорение с аппаратного датчика и подсчитываю количество раз, которое датчик считывается в секунду.

Ниже приведен очень простой пример того, что я делаю.Я получаю датчик в onCreate() и регистрирую слушателя в onResume(), где я выбираю предпочтительную частоту опроса, в данном случае SENSOR_DELAY_FASTEST (я знаю, что это всего лишь предложение и может быть изменено ОС).В onSensorChanged() я проверяю, действительно ли событие происходило от акселерометра.Здесь у меня есть небольшой фрагмент, который подсчитывает и регистрирует количество выборок в секунду.

Вот часть, которую я не понимаю: на Galaxy S10 (Android 9.0) я получаю 6 выборок в секундунезависимо от выбранной частоты опроса .На других устройствах, таких как Huawei Honor, Galaxy S5, я получаю 50 выборок в секунду с SENSOR_DELAY_GAME и быстрее с SENSOR_DELAY_FASTEST.Есть ли способ, которым я могу повлиять на это?6 выборок в секунду слишком мало для моего приложения.

Я уже отключил оптимизацию приложения для этого приложения на своем устройстве.Это не решило мою проблему.Стоит отметить, что гироскоп обновляется 100 раз в секунду на этом устройстве.

public class MainActivity extends AppCompatActivity implements SensorEventListener{
  private SensorManager sensorManager;
  private Sensor accelerometer;
  private int samples, times;
  private long previousTime;

  protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
    accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

    previousTime = System.currentTimeMillis();
  }


  protected void onResume(){
    super.onResume();
    sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_FASTEST);
  }


  protected void onPause(){
    super.onPause();
    sensorManager.unregisterListener(this);
  }


  public void onSensorChanged(SensorEvent event){
    if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
      samples++;
      if(previousTime + 1000 <= System.currentTimeMillis()){
        Log.i("MainActivity", String.valueOf(samples/times));
        times++;
        previousTime = System.currentTimeMillis();
      }
    }
  }
}
...