2015-04-03 2 views
0

Я хотел установить индивидуальный интервал датчика событий рядом:Android SensorManager registerListener - невозможно установить пользовательский интервал датчика событий

данные задержки: «SENSOR_DELAY_NORMAL, SENSOR_DELAY_U, SENSOR_DELAY_GAME, ENSOR_DELAY_FASTEST».

Но не из methodes «registerListener», кажется, поддерживает отдельное значение: every methode need "rateUS" Заглядывая в реализации класса SensorManager показывает:

public boolean registerListener(SensorEventListener listener, Sensor sensor, int rateUs, 
     int maxBatchReportLatencyUs) { 
     int delay = getDelay(rateUs); 
     return registerListenerImpl(listener, sensor, delay, null,maxBatchReportLatencyUs, 0); 
    } 


    private static int getDelay(int rate) { 
     int delay = -1; 
     switch (rate) { 
      case SENSOR_DELAY_FASTEST: 
       delay = 0; 
       break; 
      case SENSOR_DELAY_GAME: 
       delay = 20000; 
       break; 
      case SENSOR_DELAY_UI: 
       delay = 66667; 
       break; 
      case SENSOR_DELAY_NORMAL: 
       delay = 200000; 
       break; 
      default: 
       delay = rate; 
       break; 
     } 
     return delay; 
    } 

Есть ли действительно никакого способа установить отдельное значение для интервал событий датчика?

ответ

1

SENSOR_DELAY_NORMAL, SENSOR_DELAY_UI и т. Д. Все просто целые числа, как показано в вашем коде. Если вы хотите, чтобы SENSOR_DELAY_UI был таким же, как указание диспетчеру датчика использовать интервал в 66667 микросекунд. Однако в документах вы можете просто ввести свой собственный интервал в этом поле:

Желаемая задержка между двумя последовательными событиями в микросекундах. Это всего лишь намек на систему. События могут быть получены быстрее или медленнее, чем указанная ставка. Обычно события получают быстрее. Может быть одним из SENSOR_DELAY_NORMAL, SENSOR_DELAY_UI, SENSOR_DELAY_GAME, SENSOR_DELAY_FASTEST или задержкой в ​​микросекундах.

Однако, важно отметить другую часть этой цитаты:

... Нужную задержку между двумя последовательными событиями в микросекундах. Это всего лишь намек на систему. ...

В конце концов, это всего лишь предположение, и Android системы, кажется, не слишком хорошо о соблюдении вашего запроса. Если вам действительно нужен интервал, я бы предложил добавить метод в ваш обратный вызов, который проверяет временную дельта между теперь и в последний раз, когда вы записали значение датчика, а затем только записываете его, если он достаточно длинный.

Источник: Android Link

1

Вы можете просто использовать и boolean флаг Timer, чтобы справиться с этой проблемой:
представьте себе, вы хотите, чтобы проверить значение событий датчика каждые 1 секунды (например):

boolean mustReadSensor; 
Timer timer = new Timer(); 
timer.scheduleAtFixedRate(new TimerTask() { 
    @Override 
    public void run() {   
     mustReadSensor = true;  
    } 
}, 0, 1000); // 1000 ms delay 

и здесь onSensorChanged:

@Override 
public void onSensorChanged(SensorEvent event) { 
    if (!mustReadSensor) { 
     return; 
    } 
    mustReadSensor = false; 
    //handle sensor values here 
} 
Смежные вопросы