Невозможно зарегистрировать более одного датчика в службе Android

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

EDIT: я удалил две строки в onSensorChange()

**sensorManager.unregisterListener(this);
        sensorManager = null;**

И теперь это работает. ПОЧЕМУ?

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

Вот функция OnCreate моей службы:

@Override
    public void onCreate() {
        super.onCreate();
        mContext = getApplicationContext();
        Toast.makeText(getApplicationContext(),"Service Created",Toast.LENGTH_SHORT).show();
        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);

        //mAccelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        mMagnetometer = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
        //mGyro = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
        //      mLinearAccelertion = sensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION);

        //sensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
        sensorManager.registerListener(this, mMagnetometer, SensorManager.SENSOR_DELAY_NORMAL);
        //sensorManager.registerListener(this, mGyro, SensorManager.SENSOR_DELAY_NORMAL);
        //sensorManager.registerListener(this, mLinearAccelertion, SensorManager.SENSOR_DELAY_NORMAL);


    }

Вот моя функция onSensorChanged:

    @Override
    public void onSensorChanged(SensorEvent event) {
        //Toast.makeText(mContext,"Heelooo" , Toast.LENGTH_SHORT).show();
        float[] values = event.values;
        Sensor mSensor = event.sensor;
        boolean res = CalculatePosition.calculateNewPosition(4.5F,5.3F);
        if(res){
            Toast.makeText(mContext, "Check", Toast.LENGTH_SHORT).show();
        }
        //CalculatePosition.test(event);
        sensorManager.unregisterListener(this);
        sensorManager = null;
}

Я запускаю такую ​​службу в функции MyActivity onCreate:

intent = new Intent(this, CustomSensorService.class);
        startService(intent);

Кошка из бревен


person Dawood Awan    schedule 13.10.2013    source источник


Ответы (1)


Ваше событие OnSensorChanged устанавливает для SensorManager значение Null, поэтому, как только датчик срабатывает, больше нельзя установить.

ИЗМЕНИТЬ

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

private void SetupSensors() {
    sensorManager.registerListener(MagneticListener, sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_NORMAL);
}

private SensorEventListener MagneticListener = new SensorEventListener() {

    @Override
    public void onSensorChanged(SensorEvent sensorEvent) {
        // Code here
    }

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

    }
};
person Kuffs    schedule 13.10.2013
comment
Как мне тогда остановить SensorListener? - person Dawood Awan; 13.10.2013
comment
Вы останавливаете его так, как уже делаете, но вы не можете зарегистрировать другого слушателя после того, как установили для sensorManager значение null. Либо не аннулируйте sensorManager, либо назначьте другой экземпляр менеджера. - person Kuffs; 13.10.2013
comment
SensorManager.unregisterListener (это); Эта строка отменит регистрацию всех прослушивателей датчиков? - person Dawood Awan; 13.10.2013
comment
По сути, как только вы устанавливаете прослушиватель, он срабатывает, запускает код прослушивателя, который обнуляет его. Затем код возвращается и пытается установить другого слушателя, но sensorManager теперь имеет значение null, поэтому он выдает NPE. - person Kuffs; 13.10.2013
comment
да. Вы используете один и тот же прослушиватель во всех датчиках. - person Kuffs; 13.10.2013