2017-05-29 43 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值。我如何看到陀螺仪的值 –