Точность всегда равна 0 в SENSOR_ACCELEROMETER (Android)

#android #accelerometer

#Android #акселерометр

Вопрос:

Я программирую приложение, которому необходимо получать данные с датчика акселерометра.

Я перезаписал обе функции onAccuracyChanged () и onSensorChanged(). Предполагается, что эти функции вызываются только при изменении точности или значений датчика, но в моем случае они меняются много раз в секунду и всегда возвращают одни и те же значения.

     @Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
    if(sensor.getType()==Sensor.TYPE_ACCELEROMETER){
        Log.d(TAG, "Accuracy has changed: " accuracy);
    }
}

@Override
public void onSensorChanged(SensorEvent event) {
    if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
        x = event.values[SensorManager.DATA_X];
        y = event.values[SensorManager.DATA_Y];
        z = event.values[SensorManager.DATA_Z];
        Log.d(TAG, "Sensor changed: "  event.accuracy ", " x ", " y ", " z);
    }       
}
  

Это раздражает, но также раздражает, что точность всегда равна 0 (SensorManager.SENSOR_STATUS_UNRELIABLE), поэтому я не могу ему доверять.

Что может происходить? Устройство Samsung Galaxy S, поэтому у него есть акселерометр.

Спасибо!

Комментарии:

1. точность зависит от аппаратной конфигурации датчика. Вы не можете исправить это своим кодом.

2. Хороший вопрос. Я нахожу то же самое в sony ericson xperia x10 mini pro и в htc desire. Более того, я думаю, что я вижу разную точность при каждом запуске и изменении настроек в своих приложениях..

Ответ №1:

вы можете возвращать значения с плавающей точкой и очень точные, вы можете просто преобразовать их в целое число или даже использовать условие, чтобы получить результат только тогда, когда телефон находится в определенном положении

 @Override
public void onSensorChanged(SensorEvent event) {

    if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){

        x = event.values[SensorManager.DATA_X];

        y = event.values[SensorManager.DATA_Y];

        z = event.values[SensorManager.DATA_Z];

        if( x > -3 amp;amp; x < 3  amp;amp; y > -3 amp;amp; y < 3  amp;amp; z < -7 amp;amp; z > -13  ){
         // this will return value only when the phone is upside down on the table
         // u can set as ur own liking
         Log.d(TAG, "Sensor changed: "  event.accuracy ", " x ", " y ", " z);
        }
    }       
}