Проблема с датчиком Android

Мне нужно получить данные с нескольких датчиков. Я попытался создать одного слушателя для всех датчиков и попытался создать отдельных слушателей для каждого датчика. Ни один из методов не работает, если добавлено более одного датчика. Если добавлено несколько датчиков, данные, полученные датчиком, недействительны. Кто-нибудь нашел решение этой проблемы?

Вот код для добавления датчиков:

List <Sensor> sensorList = sensorManager.getSensorList(Sensor.TYPE_ALL);

    //add sensor listeners
    for(Sensor curSensor : sensorList){
        sensorManager.registerListener(sensorListener,
            curSensor,
            SensorManager.SENSOR_DELAY_NORMAL);
    }

Вот код, отвечающий на изменения датчика:

sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    sensorListener = new SensorEventListener(){
        @Override
        public void onAccuracyChanged(Sensor arg0, int arg1){

        }

        @Override
        public void onSensorChanged(SensorEvent event){
            sensorValues.put(Integer.valueOf(event.sensor.getType()),event.values);
            updateDisplayValues();
        }
    };

и, наконец, вот код для обновления дисплея:

    private void updateDisplayValues(){
    Enumeration<Integer> keys = sensorValues.keys();
    int curIndex = 0;

    while(keys.hasMoreElements()){

        Integer key = keys.nextElement();
        String curStringForKey = getStringForKey(key);

        if(curStringForKey==null)continue;

        float [] value = sensorValues.get(key);
        if(key==TYPE_ORIENTATION){
            ValueDisplay[curIndex].setText(curStringForKey + ": " + getResources().getConfiguration().orientation);
        }else{
            String stringToPrint = new String();
            int paramLength = value.length;
            for(int i = 0; i <paramLength; i++)
                stringToPrint += value[i]+", ";

            ValueDisplay[curIndex].setText(curStringForKey + ": " + stringToPrint);
        }
        curIndex ++;

    }

}

person user1832287    schedule 17.11.2012    source источник
comment
Хм, опубликуйте свой код, чтобы мы могли видеть, что вы делаете. Я не слышал об этой проблеме раньше: Есть ли способ получить данные с нескольких датчиков в Android.   -  person Sam    schedule 17.11.2012
comment
Какой тип данных sensorValues?   -  person Sam    schedule 17.11.2012
comment
Объявлено это так: private volatile Hashtable‹Integer, float[]› sensorValues;   -  person user1832287    schedule 17.11.2012
comment
Я не использовал ваш updateDisplayValues(), я просто использовал Log.v(event.sensor.getName(), Arrays.toString(event.values)); в onSensorChanged(). Данные, которые я видел, были достоверными. Я даже выделил датчик освещенности, как вы упомянули ниже, но я не могу воспроизвести то, что вы описали. Я предполагаю, что что-то не так в updateDisplayValues().   -  person Sam    schedule 17.11.2012


Ответы (1)


Что ты имеешь ввиду:

данные, полученные датчиком, недействительны

Я считаю, что проблема не в регистрации нескольких датчиков, если вы просто напечатали тип и значение датчика в методе onSensorChanged, то есть используйте Log.d(), все должно работать нормально.

Проблема в объекте sensorValues и способе доступа к нему в методе updateDisplayValues. Убедитесь, что это поточно-ориентированный тип.

Обновления датчиков происходят очень быстро, и выполнение цикла в updateDisplayValues() кажется неправильным.

РЕДАКТИРОВАТЬ:

String stringToPrint = new String();
int paramLength = value.length;
        for(int i = 0; i <paramLength; i++)
            stringToPrint += value[i]+", ";

Это не связано с вашим вопросом, но приведенный выше код действительно не является хорошей практикой. Строки являются неизменяемыми объектами, поэтому каждый раз, когда вы пытаетесь изменить строку (например, stringToPrint += "value"), будет создан новый строковый объект. Вместо этого используйте StringBuffer или StringBuilder (один потокобезопасен, а другой нет)

person iTech    schedule 17.11.2012
comment
Я имею в виду, что, например, датчик освещенности возвращает массив из трех чисел с плавающей запятой в диапазоне от отрицательной 1 до 200, когда другие датчики включены, и возвращает значение от 30 до 40, когда другие датчики не включены. SensorValues ​​является Hashtable и объявлен изменчивым. Я изменил функцию updateDisplay, чтобы она выполнялась только один раз в секунду. Ошибка все еще присутствует. - person user1832287; 17.11.2012
comment
Попробуйте удалить Hashtable и обработать данные непосредственно в onSensorChanged, т.е. поместить код из updateDisplayValues() непосредственно в onSensorChanged и посмотреть, будет ли он работать. - person iTech; 18.11.2012
comment
В итоге я вызвал функцию updateDisplay с заданным интервалом, независимо от того, как быстро обновлялись датчики. Это решило проблему. Спасибо iTech за информацию о правильной настройке строки. Я не был уверен, как это сделать. - person user1832287; 18.11.2012