Android 单击按钮后获取传感器数据x秒

Android 单击按钮后获取传感器数据x秒,android,onclick,android-sensors,Android,Onclick,Android Sensors,我仍在学习Android开发,如果这个问题看起来很愚蠢,我很抱歉,但我正试图在有限的时间内从手机上获取加速计数据。目标是在单击按钮后仅记录传感器的x坐标值约3秒钟 public class AccelerometerTestingActivity extends Activity implements SensorEventListener { private SensorManager sensorManager; float x_event[]; @Override

我仍在学习Android开发,如果这个问题看起来很愚蠢,我很抱歉,但我正试图在有限的时间内从手机上获取加速计数据。目标是在单击按钮后仅记录传感器的x坐标值约3秒钟

public class AccelerometerTestingActivity extends Activity implements SensorEventListener {
    private SensorManager sensorManager;
    float x_event[];
    @Override
    public void onCreate(Bundle savedInstanceState){

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        sensorManager=(SensorManager)getSystemService(SENSOR_SERVICE);
        // add listener. The listener will be HelloAndroid (this) class
        sensorManager.registerListener(this,
                sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                SensorManager.SENSOR_DELAY_GAME);

    }

    public void onAccuracyChanged(Sensor sensor,int accuracy){

    }

    public void onSensorChanged(SensorEvent event){

        // check sensor type
        if(event.sensor.getType()==Sensor.TYPE_ACCELEROMETER){

            // assign directions
            float x=event.values[0];
            x_event=addArrayElement(x_event,x);
        }
    }

    private float[] addArrayElement(float[] currentArray, float x) {
        // TODO Auto-generated method stub
        float newArray[] = new float[currentArray.length+1];
        int i= 0;

        for(i=0;i<currentArray.length;i++)
        {
            newArray[i] = currentArray[i];
        }

        newArray[i+1]=x;

        return newArray;
    }
公共类AccelerometerTestingActivity扩展活动实现SensorEventListener{
私人传感器管理器传感器管理器;
浮动x_事件[];
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
sensorManager=(sensorManager)getSystemService(传感器服务);
//添加侦听器。侦听器将是HelloAndroid(this)类
sensorManager.registerListener(此,
sensorManager.getDefaultSensor(传感器类型\加速计),
传感器管理器。传感器(延迟游戏);
}
精度更改时的公共无效(传感器,int精度){
}
传感器更改时的公共无效(传感器事件){
//检查传感器类型
if(event.sensor.getType()==sensor.TYPE\u加速计){
//指点
float x=事件值[0];
x_事件=添加数组元素(x_事件,x);
}
}
私有float[]addArrayElement(float[]currentArray,float x){
//TODO自动生成的方法存根
float newArray[]=newfloat[currentArray.length+1];
int i=0;

对于(i=0;i您是否考虑过使用计时器,在3秒延迟后, -注销侦听器 -调用您的分析函数 ?这里有一个快速的解决方案; 在您的
onCreate()
中,注册侦听器后,您可以执行以下操作:

    final SensorEventListener listener = this;
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            sensorManager.unregisterListener(listener);
        }
    }, theTimeInMilliseconds);

你也应该考虑使用一个列表而不是一个数组来保存你的值,这样你就不必每次获得一个新的值时重新创建它:

ArrayList<Float> xEvent = new ArrayList<Float>();
解决了问题 只需使用定时器类方法,每1s执行一次

new Timer().scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {

                                     // Just calculate your accleration here

                              }
                                                 }, 0, 1000);

我认为更好的解决方案是

不,我没有尝试过。我需要的是“注销侦听器”。谢谢,应该可以。我会尝试一下,回来验证它是否有效。非常感谢谢谢谢谢,非常有用,工作非常完美。我将我的应用程序更改为使用列表,这更容易谢谢。感谢sensorManager.unregisterListener(监听器);,使用我的代码,如何获取对实际监听器的引用?它不能单独实例化然后注册/取消注册,可以吗?我更新了我的解决方案以更好地使用您的代码:)我通常有一个独立于活动的自定义sensorlistener和一个变量引用,但在这种情况下,您可以使用“this”获取引用(“this”在runnable内部不起作用,因为在这种情况下,它将是对runnable的引用,而不是对活动的引用)
new Timer().scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {

                                     // Just calculate your accleration here

                              }
                                                 }, 0, 1000);