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 последовательными выборками в мс
Большое спасибо.