2012-11-17 124 views
0

我需要從多個傳感器獲取數據。我曾嘗試爲所有傳感器創建單個監聽器,並嘗試爲每個傳感器創建單獨的監聽器。如果添加多於一個傳感器,這兩種方法都不起作用。如果添加了多個傳感器,則傳感器生成的數據無效。有沒有人找到解決這個問題的辦法?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 ++; 

    } 

} 
+0

嗯,發佈你的代碼,以便我們可以看到你在做什麼。我之前沒有聽說過這個問題:[有沒有辦法在Android中檢索多個傳感器數據](http://stackoverflow.com/q/4343342/1267661)。 – Sam

+0

'sensorValues'是什麼數據類型? – Sam

+0

它是這樣聲明的:private volatile Hashtable sensorValues; – user1832287

回答

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(一個是線程安全的,另一個不是)

+0

我的意思是說,例如,當其他傳感器啓用時,光傳感器返回一個範圍從負1到200的三個浮標陣列,並在其他傳感器未啓用時返回30-40之間的值。 sensorValues是一個Hashtable並被聲明爲volatile。我將updateDisplay函數更改爲每秒只執行一次。錯誤仍然存​​在。 – user1832287

+0

嘗試刪除散列表並直接在onSensorChanged中處理數據,即將代碼從updateDisplayValues()直接放入onSensorChanged中並查看它是否可行。 – iTech

+0

我最終以設定的間隔調用updateDisplay函數,無論傳感器更新的速度如何。這解決了問題。謝謝iTech有關正確設置字符串的信息。我不確定如何做到這一點。 – user1832287