2015-01-26 53 views
4

今天晚上我用傳感器遇到了很多麻煩,但它看起來是因爲onSensorChanged()沒有被調用。對不起,最終重複的問題,但我沒有看到任何解決方案。 這裏是我的代碼:onSensorChanged()不叫

public SensorManager manager; 
public Sensor rotation_vector; 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    manager = (SensorManager)getSystemService(SENSOR_SERVICE); 
    rotation_vector = manager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR); 
} 

@Override 
public void onSensorChanged(SensorEvent event) { 
    int xValue = (int) event.values[0]; 
    int yValue = (int) event.values[1]; 
    int zValue = (int) event.values[2]; 
    Toast.makeText(getApplicationContext(),"this doesn't appear...",Toast.LENGTH_LONG); 


@Override 
public void onAccuracyChanged(Sensor sensor, int accuracy) { 
    //TODO: we'll see later about it 
} 
public void onPause() { 
     /*Et on le dés-enregistre quand on sort de l'activité, pour économiser de la batterie*/ 
     super.onPause(); 
     manager.unregisterListener(this); 
} 
@Override 
    protected void onResume() { 
     /*On enregistre le sensor quand l'utilisateur revient sur l'activité*/ 
     super.onResume(); 
     manager.registerListener(this, rotation_vector, SensorManager.SENSOR_DELAY_NORMAL); 
     if (null != rotation_vector) { 
     } else { 
      Toast.makeText(getApplicationContext(), 
        "There is no gyroscope on your device", 
       Toast.LENGTH_LONG).show(); 
     } 
    } 

我已經看到了很多不同的論壇上類似的代碼,但APPART從there和一些其他的話題沒有解決方案,我還沒有見過這樣的問題尚未... 我是否必須在AndroidManifest中添加一些內容? 這是常見問題嗎? 它有解決方案嗎?

感謝, 托馬斯 (我的英語不好對不起,我是法國人^^)

回答

5

我不是用傳感器工作,到目前爲止,但它看起來像你獲得SensorManager但沒有註冊任何應該發生變化的監聽者。只問自己怎麼可能叫onSensorChanged

看一看樣品上official android tutorial site傳感器有關,你可以在onResume()方法看到這一點:

@Override 
protected void onResume() { 
    super.onResume(); 
    mSensorManager.registerListener(this, mLight, SensorManager.SENSOR_DELAY_NORMAL); 
} 

也不要忘記學習整個頁面,它可以幫助你很多。

編輯:

我不得不復制粘貼你的源代碼,因爲我還沒有看到任何問題。有2個basicaly:

  • 吐司沒有出現,因爲你還沒有告訴他...... Toast.show()將顯示它。但您寧願使用Log將更改輸出到控制檯。這是給你
  • 不要重新輸入浮動轉換成int在onSensorChanged()方法,因爲所有的值是0或(1/-1,如果你是幸運的)

所以結果如下:

@Override 
public void onSensorChanged(SensorEvent event) { 
    float xValue = event.values[0]; 
    float yValue = event.values[1]; 
    float zValue = event.values[2]; 
    Log.d(LOG_TAG, "x:"+xValue +";y:"+yValue+";z:"+zValue); 
} 

其他方法正確

+0

嗯,我忘了我的代碼的一部分,它是在底部......它不能解決問題 – Thomas 2015-01-27 08:37:45

+0

請更新您的問題,然後,我非常確定它必須工作...另請嘗試非空檢查。如果它不工作,我會稍後深入探究 – VizGhar 2015-01-27 09:59:22

+0

完成!你通過「非空檢查」調用什麼? – Thomas 2015-01-27 15:46:07

0

您的設備可能沒有Sensor.TYPE_ROTATION_VECTOR。您應該檢查rotation_vectornull

+0

我用一個應用程序列出了設備上的每個傳感器並顯示其數據。並且旋轉矢量傳感器運行良好 – Thomas 2015-01-27 15:47:18

+0

也註冊TYPE_GYROSCOPE並查看是否現在調用TYPE_ROTATION_VECTOR。 – 2015-01-27 16:00:45