2012-05-22 20 views
2

我正試圖用「搖動」事件掛鉤一些功能。我使用的教程在這裏:無法獲得加速計來感知搖動事件

http://www.vogella.com/articles/AndroidSensor/article.html

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/os/Sensors.html

我與OpenIntents軟件SensorSimulator測試。我能夠將仿真器連接到SensorSimulator。當我在模擬器中移動設備時,仿真器上的加速度計讀數與模擬器的讀數完全相同。

在我的代碼,我添加了一些日誌之類的語句:

public class ShakeEventListener implements SensorEventListener { 

private void getAccelerometer(SensorEvent event) { 

    float[] values = event.values; 
// Movement 
float x = values[0]; 
float y = values[1]; 
float z = values[2]; 

float accelationSquareRoot = (x * x + y * y + z * z) 
     /(SensorManager.GRAVITY_EARTH * SensorManager.GRAVITY_EARTH); 
long actualTime = System.currentTimeMillis(); 
Log.i("onSensorChanged", "accelationSquareRoot: " + accelationSquareRoot); 

if (accelationSquareRoot >= 2) // 
{ 
    if (actualTime - lastUpdate < 200) { 
    return; 
    } 
    lastUpdate = actualTime; 

     // Shake Detected 
    Log.i("onSensorChanged", "Shakie Shakie!"); 
    } 
} 

public void onSensorChanged(SensorEvent se) { 

    Log.d("onSensorChanged", "X: " + se.values[SensorManager.DATA_X] + 
       " Y: " + se.values[SensorManager.DATA_Y] + 
       " Z: " + se.values[SensorManager.DATA_Z]); 

    if (se.sensor.getType() == Sensor.TYPE_ACCELEROMETER) 
    { 
    getAccelerometer(se); 
    } 
} 
} 

日誌貓的輸出似乎不一樣,如果我移動設備模擬器改變。它總是顯示這些讀數(讀數不斷更新每分鐘一堆次,但他們總是相同的):

05-22 15:09:07.717: I/onSensorChanged(686): accelationSquareRoot: 1.0006835 
05-22 15:09:08.518: D/onSensorChanged(686): X: 0.0 Y: 9.77622 Z: 0.813417 
05-22 15:09:08.518: I/onSensorChanged(686): accelationSquareRoot: 1.0006835 

我試過APIDemos樣品sensors.java但是這也註冊相同的行爲。我可能會錯過什麼?

回答

3

這是加速度計的代碼,我的應用程序工作:

// shake 
private SensorManager mSensorManager; 
private float mAccel; // acceleration apart from gravity 
private float mAccelCurrent; // current acceleration including gravity 
private float mAccelLast; // last acceleration including gravity 


    //Shake 
    private final SensorEventListener mSensorListener = new SensorEventListener() { 
     int count = 0; 
     public void onSensorChanged(SensorEvent se) { 

      float x = se.values[0]; 
      float y = se.values[1]; 
      float z = se.values[2]; 
      mAccelLast = mAccelCurrent; 
      mAccelCurrent = (float) Math.sqrt((double) (x*x + y*y + z*z)); 
      float delta = mAccelCurrent - mAccelLast; 
      mAccel = mAccel * 0.9f + delta; // perform low-cut filter 
      if (mAccel > 5) { 
       //do something 
      } 
     } 

     public void onAccuracyChanged(Sensor sensor, int accuracy) { 

     } 
     }; 

這裏是source我怎麼來到這個代碼片段。

+0

我已經開始與你鏈接的源,然後我嘗試了其他人(大量的樣本)。沒有什麼似乎爲我工作。 –

+0

您可能需要咬緊牙關,購買真正的手機進行測試。從長遠來看,它也可以節省很多頭痛。 – Nick

+0

它也不適用於該設備。謝謝你的時間。 –

1

在我的遊戲我已經實現這件事情from here

的示例代碼是真的很簡單,易於理解。

MyActivity.java

public class MyActivity extends Activity 
{ 
    private MyView m_myView; 
    private SensorManager m_sensorManager; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    {   
     super.onCreate(savedInstanceState); 

     m_myView = (MyView)findViewById(R.id.my_view); 

     m_sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
     m_sensorManager.registerListener(m_myView, 
       SensorManager.SENSOR_ACCELEROMETER, 
       SensorManager.SENSOR_DELAY_GAME); 
    } 

     @Override 
     protected void onPause() 
     { 
       super.onPause(); 

       m_sensorManager.unregisterListener(m_myView); 
     } 

     @Override 
     protected void onResume() 
     {    
       super.onResume(); 

       m_sensorManager.registerListener(m_myView, 
         SensorManager.SENSOR_ACCELEROMETER, 
         SensorManager.SENSOR_DELAY_GAME; 
     } 
} 

MyView.java

public class MyView extends View implements SensorListener 
{ 
    private float m_totalForcePrev; // stores the previous total force value 

    // do your constructor and all other important stuff here 
    // make sure you set totalForcePrev to 0 
    // ... 

     public void onAccuracyChanged(int arg0, int arg1) 
     { 
       // I have no desire to deal with the accuracy events 
     } 

     public void onSensorChanged(int sensor, float[] values) 
     {  
       if(sensor == SensorManager.SENSOR_ACCELEROMETER) 
       { 
         double forceThreshHold = 1.5f; 

         double totalForce = 0.0f; 
         totalForce += Math.pow(values[SensorManager.DATA_X]/SensorManager.GRAVITY_EARTH, 2.0); 
         totalForce += Math.pow(values[SensorManager.DATA_Y]/SensorManager.GRAVITY_EARTH, 2.0); 
         totalForce += Math.pow(values[SensorManager.DATA_Z]/SensorManager.GRAVITY_EARTH, 2.0); 
         totalForce = Math.sqrt(totalForce); 

         if((m_gameState == STATE_RUNNING) && (totalForce < forceThreshHold) && (m_totalForcePrev > forceThreshHold)) 
         { 
           doWrenchWord(); 
         } 

         m_totalForcePrev = totalForce; 
       } 
     } 

} 

在你身邊的問題就可以了,

getAccelerometer(se);函數的代碼,或者您在連接做了一些錯誤SensorSimulator到你的模擬器,我想你將需要斷開它並重新連接檢查IP和端口也設置選項卡,並檢查傳感器是選擇/可用或不可用。還有一些額外的更新和刷新時間延遲設置。只需按照他們在文檔中寫入的內容進行操作即可。