2015-02-24 79 views
0

我正在研究一個項目,其中包括我試圖獲得沒有重力組件的加速度計數據。但是,我似乎無法從虛擬傳感器獲取更新:「線性加速度」和「重力」。代碼如下:TYPE_LINEAR_ACCELERATION和TYPE_GRAVITY不起作用

public class SensorModule implements SensorEventListener{ 

    (...) 

    public SensorModule(Context context){ 

     this.context = context; 
     sensorManager = (SensorManager) context.getSystemService(context.SENSOR_SERVICE); 
     sensorAccelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
     sensorMagneticField = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); 
     sensorLinearAccel = sensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION); 
     sensorGravity = sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY); 
    } 

    @Override 
    public void onAccuracyChanged(Sensor arg0, int arg1) {} 

    @Override 
    public void onSensorChanged(SensorEvent event) { 
     switch(event.sensor.getType()){ 
     case Sensor.TYPE_ACCELEROMETER: 
      ((SensorActivity)context).accelX.setText("" + event.values[0]); 
      ((SensorActivity)context).accelY.setText("" + event.values[1]); 
      ((SensorActivity)context).accelZ.setText("" + event.values[2]); 
      break; 
     case Sensor.TYPE_MAGNETIC_FIELD: 
      ((SensorActivity)context).magneX.setText("" + event.values[0]); 
      ((SensorActivity)context).magneY.setText("" + event.values[1]); 
      ((SensorActivity)context).magneZ.setText("" + event.values[2]); 
      break; 
     case Sensor.TYPE_LINEAR_ACCELERATION: 
      ((SensorActivity)context).linearX.setText("" + event.values[0]); 
      ((SensorActivity)context).linearY.setText("" + event.values[1]); 
      ((SensorActivity)context).linearZ.setText("" + event.values[2]); 
      break; 
     case Sensor.TYPE_GRAVITY: 
      ((SensorActivity)context).gravityX.setText("" + event.values[0]); 
      ((SensorActivity)context).gravityY.setText("" + event.values[1]); 
      ((SensorActivity)context).gravityZ.setText("" + event.values[2]); 
     } 
    } 

    public void registerListeners(){ 
     sensorManager.registerListener(this, sensorAccelerometer, SensorManager.SENSOR_DELAY_NORMAL); 
     sensorManager.registerListener(this, sensorMagneticField, SensorManager.SENSOR_DELAY_NORMAL); 
     sensorManager.registerListener(this, sensorLinearAccel, SensorManager.SENSOR_DELAY_NORMAL); 
     sensorManager.registerListener(this, sensorGravity, SensorManager.SENSOR_DELAY_NORMAL); 
    } 

    public void unregisterListeners(){ 
     sensorManager.unregisterListener(this, sensorAccelerometer); 
     sensorManager.unregisterListener(this, sensorMagneticField); 
     sensorManager.unregisterListener(this, sensorLinearAccel); 
     sensorManager.unregisterListener(this, sensorGravity); 
    } 

我在活動中註冊偵聽器onResume()並取消註冊onPause()。我可以從加速計和磁力計獲得更新,但是TYPE_LINEAR_ACCELERATION和TYPE_GRAVITY沒有產生任何更新。我知道我的設備具有來自getSensorList(Sensor.TYPE_ALL)的這些虛擬傳感器。另外,當我調用getDefaultSensor(...)時,它會爲這4個傳感器中的每一個都返回非空值。我分別在onSensorChanged()方法內部烘烤了每種情況,但線性和重力的情況從不出現,這意味着這些更新不會被生成。我也嘗試了一個更大的延遲(SENSOR_DELAY_UI)給它更多的時間,但仍然沒有骰子。我正在測試運行Lollipop 5.0.1(API 21)的Nexus 5。任何人都有線索?

回答

2

確定,通過應用工程和一般常識的第一個規則,問題得到解決:)剛把它關掉再打開,現在它自動工作。這有點麻煩,因爲這意味着除了使用超時線程來驗證定期更新之外,我無法知道傳感器是否正常工作。