2017-05-29 42 views
3

當前和以前event.values我需要與傳感器值變化後發送的請求。它發送的請求太多,因爲每次更改時間戳(納秒)都會調用該方法。我只需要在更改傳感器值時發送請求。 我想目前event.value比較以前event.value機器人需要比較onSensorChanged方法

import android.app.Activity; 
import android.hardware.Sensor; 
import android.hardware.SensorEvent; 
import android.hardware.SensorEventListener; 
import android.hardware.SensorManager; 
import android.os.Bundle; 
import android.widget.TextView; 

import com.android.volley.RequestQueue; 
import com.android.volley.Response; 
import com.android.volley.VolleyError; 
import com.android.volley.toolbox.StringRequest; 

public class MainActivity extends Activity implements SensorEventListener{ 
    TextView metrics,post; 
    private SensorManager sensorManager; 
    private float timestamp; 
    RequestQueue queue; 
    //private Sensor sensor; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     metrics = (TextView) findViewById(R.id.metrics); 
     post = (TextView) findViewById(R.id.post); 

     sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
     //sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE); 

    } 

    protected void onResume() 
    { 
     super.onResume(); 
     sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),SensorManager.SENSOR_DELAY_FASTEST); 
    } 

    protected void onStop() 
    { 
     sensorManager.unregisterListener(this); 
     super.onStop(); 
    } 

    public void onAccuracyChanged(Sensor arg0, int arg1) 
    { 
     //Do nothing. 
    } 

    public void onSensorChanged(SensorEvent event) 
    { 
     if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE) 
     { 
      return; 
     } 

     metrics.setText("Orientation X (Roll) :"+ Float.toString(event.values[0]) +"\n"+ 
       "Orientation Y (Pitch) :"+ Float.toString(event.values[1]) +"\n"+ 
       "Orientation Z (Yaw) :"+ Float.toString(event.values[2])); 

     if (event.values[0] != || event.values[1] != || event.values[2] !=) { 

      RequestQueue queue = MySingleton.getInstance(this.getApplicationContext()). 
        getRequestQueue(); 

      String url ="http://10.46.2.179:8080/?X=" + event.values[0] + "&&Y=" + event.values[1] + "&&Z=" + event.values[2]; 

      StringRequest stringRequest = new StringRequest(com.android.volley.Request.Method.POST, url, new Response.Listener<String>() { 
       @Override 
       public void onResponse(String response) { 
        //post.setText(response); 
        //Log.i("VOLLEY", response); 
       } 
      }, new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        //post.setText(error.toString()); 
        //Log.e("VOLLEY", error.toString()); 
       } 
      }); 

      MySingleton.getInstance(this).addToRequestQueue(stringRequest); 
     } 

    } 
} 

回答

0

爲此在您的onSensorChanged

private float last_x, last_y, last_z; 
    @Override 
    public void onSensorChanged(SensorEvent sensorEvent) { 

     if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { 
      long curTime = System.currentTimeMillis(); 
      // only allow one update every 100ms. 

      // if ((curTime - lastUpdate) > 150) { 


       x = 0; 
       y = 0; 
       z = 0; 
       x = sensorEvent.values[0]; 
       y = sensorEvent.values[1]; 
       z = sensorEvent.values[2]; 

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

        last_x = x; 
        last_y = y; 
        last_z = z; 
       } 
      } 

last_xlast_ylast_z將以前的值。希望這有助於

+0

我怎麼inititalize這些值lastx,lasty,LASTZ? –

+0

什麼是lastUpdate變量? –

+0

無法發送請求。不理解邏輯。什麼樣的價值觀正在進入X,Y,X和lastx,lasty,在XYZ的當前值LASTZ –

1

考慮使用Sensor Batching,越來越多的智能手機都支持它。基本上,事件存儲在硬件隊列中,並定期一次發送到您的應用程序。在那裏,您可以在一次調用中比較所有結果。

在你的代碼中的唯一行,你必須改變是:

sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),SensorManager.SENSOR_DELAY_FASTEST); 

增加了第四個參數定義:

sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),SensorManager.SENSOR_DELAY_FASTEST, max_report_latency_ns); 

如果這max_report_value是:

當max_report_latency_ns > 0,傳感器事件一旦被檢測到就不需要報告。只要沒有事件的延遲超過max_report_latency_ns納秒,它們可以暫時存儲在硬件FIFO中並批量報告。也就是說,自上一批以來的所有事件都會被記錄並立即返回。這減少了發送到SoC的中斷數量,並允許SoC在傳感器捕獲和批量處理數據時切換到低功耗模式(空閒)。

+0

此外,我需要獲得陀螺儀指標,目前我無法在Android Studio中使用Nexus 6仿真器看到。我得到傳感器返回空錯誤。目前我正在使用Magentic Field值。我如何看到陀螺儀的值 –