0

我需要从多个传感器获取数据。我尝试为所有传感器创建一个侦听器,并尝试为每个传感器创建单独的侦听器。如果添加了一个以上的传感器,这两种方法都不起作用。如果添加多个传感器,则传感器产生的数据无效。有没有人找到解决这个问题的方法?

这是添加传感器的代码:

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 ++;

    }

}
4

1 回答 1

0

你是什​​么意思:

传感器产生的数据无效

我相信问题不在于注册多个传感器,如果您只是在 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(一个是线程安全的,另一个不是)

于 2012-11-17T18:16:57.050 回答