android 需要比较当前和以前的 event.values of 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);
        }
    }
}

考虑使用传感器批处理,越来越多的智能手机支持它。基本上,事件存储在硬件的队列中,并定期一次性发送到您的应用程序。在那里,您可以在一次通话中比较所有结果。

代码中唯一需要更改的行是:

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 时,传感器事件不需要在检测到后立即报告。它们可以临时存储在硬件FIFO中并批量报告,只要没有事件延迟超过max_report_latency_ns纳秒即可。也就是说,自上一批以来的所有事件都将立即记录并返回。这减少了发送到 SoC 的中断量,并允许 SoC 在传感器捕获和批处理数据时切换到低功耗模式(空闲(。

在你的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 将具有您以前的值。希望这有帮助

最新更新