Android потеря данных акселерометра

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

public class gService extends Service implements SensorEventListener {

    private SensorManager senSensorManager;
    private Sensor senAccelerometer;
    private static final String TAG = "MEDIA";
    private StepAnalyzer analyzer;
    private int numPass;

    public BroadcastReceiver mReceiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            // Check action just to be on the safe side.
            if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
                //Log.v("shake mediator screen off","trying re-registration");
                // Unregisters the listener and registers it again.
                senSensorManager.unregisterListener(gService.this);
                senSensorManager.registerListener(gService.this, senAccelerometer,SensorManager.SENSOR_DELAY_GAME);
            }
        }
    };

    @Override
    public void onCreate() {
        Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show();
        senSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        senAccelerometer = senSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        senSensorManager.registerListener(this, senAccelerometer , SensorManager.SENSOR_DELAY_GAME);
        analyzer = new StepAnalyzer(getApplicationContext());
        numPass = 1;
        IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF);
        registerReceiver(mReceiver, filter);
    }

    @Override
    public void onDestroy(){
        Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show();
        senSensorManager.unregisterListener(this);
        unregisterReceiver(mReceiver);
    }

    @Override
    public void onStart(Intent intent, int startid){
        Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
    }

    @Override
    public void onSensorChanged(SensorEvent sensorEvent){
        Sensor mySensor = sensorEvent.sensor;
        if (mySensor.getType() == Sensor.TYPE_ACCELEROMETER) {
            float x = sensorEvent.values[0];
            float y = sensorEvent.values[1];
            float z = sensorEvent.values[2];
            float gNorm = ((float)Math.sqrt(x * x + y * y + z * z))/ SensorManager.STANDARD_GRAVITY ;
            long time = sensorEvent.timestamp / 1000000;
            ......
            // other operations

        }
    }

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

    }

    @Override
    public IBinder onBind(Intent intent) {
        // We don't provide binding, so return null
        return null;
    }


}

Проблема в том, что когда экран включен, акселерометр выдает сэмплы с нужной частотой ( 20 мс -> SENSOR_DELAY_GAME), а когда экран выключен, сэмплерометр выдает "случайным" образом с интервалами 20 мс и интервалами. до 20 лет. Как вы можете видеть в коде, я уже реализовал обходной путь, который можно увидеть в связанных вопросах: поймать событие отключения экрана и отменить регистрацию и перерегистрировать слушателя, но без какой-либо удачи.

Я также видел, что такое поведение может быть связано с моим устройством, у меня Motorola Moto X 2014 года выпуска.

Чтобы объяснить это поведение, я прикрепляю график различий между двумя последовательными датчиками. участок

По оси X-> № выборки По оси Y-> время между 2 последовательными выборками в мс

Большое спасибо.

0 ответов

Другие вопросы по тегам