Почему акселерометр не запускается вовремя или не получает данные в обычном режиме? - PullRequest
0 голосов
/ 11 ноября 2011

Я пишу приложение, которое планирует запуск акселерометра каждые 15 секунд и запускаю его 10 секунд, чтобы получить данные датчика. Я запускаю акселерометр с помощью alarmManager и продолжаю работать с wakelock, когда экран выключается. Но я нашел иногда :

  1. Акселерометр не может получить данные через несколько периодов. Я имею в виду, что он был запущен в соответствии с logcat, но нет данных датчика, затем он закрывается и снова запускается без данных.
  2. Я не знаю, почему акселерометр больше не запускался после нескольких периодов, и раньше было хорошо. Я обнаружил, что logcat говорит: «слушатель со связующим android.os.BinderProxy не существует акселерометр». Я не знаю почему.

следующий код ядра:

Activity.java

Intent intent = new Intent(getApplicationContext(),SensorService.class);
PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
long curTime = Calendar.getInstance().getTimeInMillis();
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, curTime, _intervalTime, pendingIntent);  

SensorService.java

public void onStart(Intent intent, int startId) {

        new Thread(new Runnable(){

            public void run() {
                // TODO Auto-generated method stub
                wl.acquire();
                Log.d(TAG,"I'm bright!");
                try {
                    Thread.sleep(_delayClose);// kill self after _delayClose ms
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                stopSelf();// SensorService.this.stopSelf()
            }

        }).start();

        this.mSensorManager.registerListener( _sensorHandle, 
                accSensor, 
                sensorDelay)
}
public void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();
    this.mSensorManager.unregisterListener(_sensorHandle);
    Log.d(TAG,"TIEM UP");
    if(wl.isHeld())
    {
        wl.release();   
    }
}

1 Ответ

0 голосов
/ 11 ноября 2011

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

Учитывая, что вам часто нужны данные датчиков, как насчет того, чтобы просто сохранить ваш слушатель зарегистрированным и управлять им внутренним образом, когда он должен и не должен делать что-то полезное с образцами, которые он получает?

public class SensorSamplrActivity extends Activity {
    private final static String TAG = "samplr";
    private final static int SAMPLE_INTERVAL_SECS = 15;
    private final static int SAMPLE_DURATION_SECS = 10;

    private SensorManager mSensorManager;
    private long whenToStartSample = System.currentTimeMillis();
    private long whenToEndSample = System.currentTimeMillis() + SAMPLE_DURATION_SECS;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mSensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
        mSensorManager.registerListener(mSensorListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_GAME);
    }

    private SensorEventListener mSensorListener = new SensorEventListener() {

        @Override
        public void onAccuracyChanged(Sensor arg0, int arg1) {
            // TODO Auto-generated method stub
        }

        @Override
        public void onSensorChanged(SensorEvent event) {
            long now = System.currentTimeMillis();
            if (now < whenToStartSample){
                // ignore the event & wait for next time to sample
                Log.d(TAG,"ignoring events for " + (whenToStartSample - now) + "ms");
                return;
            }

            if (whenToStartSample <= now && whenToEndSample > now){
                Log.d(TAG,"Do something with this event @ " + now);
            }
            else {
                // we've gone past whenToEndSample so reset timers
                whenToStartSample = now + (SAMPLE_INTERVAL_SECS * 1000);
                whenToEndSample = whenToStartSample + (SAMPLE_DURATION_SECS * 1000) ;
            }
        }
    };

    @Override
    public void onDestroy(){
        super.onDestroy();
        mSensorManager.unregisterListener(mSensorListener);
    }
}
...