Датчик акселерометра Android возвращает ноль

#java #android #accelerometer

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

Вопрос:

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

Logcat выдает следующее сообщение при сбое акселерометра:

 W/SensorManager: ACCELEROMETER Sensor data was zero
  

Ниже приведен мой код:

В onCreate():

 sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);

accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
magnetometer = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
  

В onResume():

 sensorManager.registerListener(sensorListener, accelerometer, SensorManager.SENSOR_DELAY_FASTEST);
sensorManager.registerListener(sensorListener, magnetometer, SensorManager.SENSOR_DELAY_FASTEST);
  

В onPause():

 sensorManager.unregisterListener(sensorListener);
  

Слушатель:

 private SensorEventListener sensorListener = new SensorEventListener() {
        float[] mGravity;
        float[] mGeomagnetic;

        @Override
        public void onSensorChanged(SensorEvent event) {
            if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
                mGravity = event.values;
            if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
                mGeomagnetic = event.values;
            if (mGravity != null amp;amp; mGeomagnetic != null) {
                float R[] = new float[9];
                float I[] = new float[9];
                boolean success = SensorManager.getRotationMatrix(R, I, mGravity, mGeomagnetic);
                if (success) {
                    float orientation[] = new float[3];
                    SensorManager.getOrientation(R, orientation);
                }
            }
        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {

        }
    };
  

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

1. Вам нужно выполнить event.values.clone();

2. @HoanNguyen В чем польза clone() ? Я всегда могу прочитать значения и выполнить свои собственные вычисления, просто сбой с низкой вероятностью. Может ли это решить проблему стабильности? Спасибо.

3. Члены вашего класса mGravity и mGeomagnetic ссылаются на event.values, которые будут выходить за рамки, как только метод будет выполнен. Таким образом, либо mGravity, либо mGeomagnetic могут указывать на любые значения, если память восстанавливается для чего-то другого.

4. Просто введите в журнал значения mGeomagnetic, и вы, вероятно, увидите, что когда-нибудь оно изменится на новое значение, когда этого не должно быть, то есть когда event.sensor.GetType() == Sensor . TYPE_ACCELEROMETER .

5. @HoanNguyen Спасибо за ваше объяснение. Я добавил clone() в свой код, но требуется время, чтобы узнать, решило ли это мою проблему. Спасибо!