2011-08-04 38 views
2

我正在處理需要檢測加速計運動的應用程序,例如根據這些動作將手機抖動或傾斜到正確,左側,上下,並向UPnP設備發送一些密鑰。在android中檢測加速度計運動

例如,如果檢測到正確的運動增加媒體服務器的音量,反之亦然。

請幫我解決這個問題。

我試過一些例子。它左右工作正常。但我需要一個更好的解決方案。

這裏我添加了代碼。

 sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
    sensorManager.registerListener(this, 
      sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), 
      SensorManager.SENSOR_DELAY_NORMAL); 
    lastUpdate = System.currentTimeMillis(); 


    @Override 
public void onSensorChanged(SensorEvent event) { 
    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { 

     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.AXIS_X * SensorManager.AXIS_X);*/ 

     Log.d("Shakes","X: "+x+" Y: "+y+" Z: "+z); 

     long actualTime = System.currentTimeMillis(); 
     if ((actualTime - lastUpdate) > 100) 
     { 
      long diffTime = (actualTime - lastUpdate); 
      lastUpdate = actualTime; 


     if(Round(x,4)>8.0000){ 
      Log.d("sensor", "=====LEFT===="); 


     } 
     else if(Round(x,4)<-8.0000){ 
      Log.d("sensor", "=====RIGHT===="); 

     } 
     else if(Round(z,4) < -0.0){ 
      Log.d("sensor", "=====UP===="); 


     } 

     else if(Round(y,4) < 1.0){ 
      Log.d("sensor", "=====DOWN===="); 

     } 

     float speed = Math.abs(x+y+z - last_x - last_y - last_z)/diffTime * 10000; 

     if (speed > SHAKE_THRESHOLD) { 
      //Log.d("sensor", "shake detected w/ speed: " + speed); 
      //Toast.makeText(this, "shake detected w/ speed: " + speed, Toast.LENGTH_SHORT).show(); 
     } 
     last_x = x; 
     last_y = y; 
     last_z = z; 
     } 
    } 

} 
+0

是你能夠解決您的問題? – moDev

回答

2

X軸水平指向右側,Y軸垂直指向上方,Z軸指向屏幕正面外側。在這個系統中,屏幕後面的座標具有負Z值。

All Motion

針對你的情況詳細Android Developer

嘗試。

 if(Round(x,4)>8.0000){ 
      Log.d("sensor", "=====LEFT===="); 


     } 
     else if(Round(x,4)<-8.0000){ 
      Log.d("sensor", "=====RIGHT===="); 

     } 
     else if(Round(y,4) < 8.0){ 
      Log.d("sensor", "=====UP===="); 


     } 

     else if(Round(y,4) < -8.0){ 
      Log.d("sensor", "=====DOWN===="); 

     } 
+0

嗨CapDroid,感謝您的建議,,我試過這個,但它會影響用戶閾值。我的意思是說,用戶應該始終以垂直方式握住手機。如果我使用y的這個值,並且如果我以正常可讀的方式握住手機,它將始終發送上移動鍵。 – bHaRaTh

+0

即時嘗試一些準確的值,這將不會影響用戶正常的重撥手機的方式。即時嘗試與Y和Z的組合。仍然沒有找到任何好結果 – bHaRaTh

+0

我沒有嘗試過它的兄弟.. –

1
if(Round(x,4)>8.0000){ 
      Log.d("sensor", "=====LEFT===="); 


     } 
     else if(Round(x,4)<-8.0000){ 
      Log.d("sensor", "=====RIGHT===="); 

     } 
     else if (z >9 && z < 10) 
      Log.d("sensor", "=====DOWN===="); 

     else if (z > -10 && z < -9) 
      Log.d("sensor", "=====UP====");