Android 用于记录传感器数据的按钮

Android button for recording sensor data

我是 Android 平台的新手。我编写了代码,粘贴在下面,用于记录单击按钮时来自磁传感器的数据。但是当我点击按钮(按钮 id - btnRecord)时,它只会记录几秒钟的数据,我必须再次点击才能记录更多。如何通过第一次点击开始连续记录数据?先感谢您。

@Override
public void onSensorChanged(SensorEvent event) {
    Sensor sensor = event.sensor;
    a= event.values[0];
    b=event.values[1];
    c=event.values[2];

    if (sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
        magnetismx.setText(Float.toString(event.values[0]));
        magnetismy.setText(Float.toString(event.values[1]));
        magnetismz.setText(Float.toString(event.values[2]));
        Button button2 = (Button) findViewById(R.id.btnRecord);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getBaseContext(), "Data Recording Started" , Toast.LENGTH_SHORT ).show();
                try {
                    writeToCsv(Float.toString(a), Float.toString(b), Float.toString(c));
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
    }
}

从回调 onSensorChanged 中删除 Button。你在那里不需要它。在其他地方定义 Button 例如在 onCreate() 方法中,例如

onCreate()
Button button2 = (Button) findViewById(R.id.btnRecord);
button2.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                   flip = !flip;
            });

布尔字段 flip 用于控制 onSensorChanged 回调的写入行为。所以在你的 class 中定义一个私有字段 flip 并像这样使用它

 @Override
    public void onSensorChanged(SensorEvent event) {
        Sensor sensor = event.sensor;
        a= event.values[0];
        b=event.values[1];
        c=event.values[2];
        if (sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {

        magnetismx.setText(Float.toString(event.values[0]));
        magnetismy.setText(Float.toString(event.values[1]));
        magnetismz.setText(Float.toString(event.values[2]));
        if(flip) writeToCsv(Float.toString(a), Float.toString(b), Float.toString(c));
    }
}

写入文件的代码在onClick() 仅在点击按钮时执行,执行一次。

会调用onSensorChanged(),但不会再执行onClick()

你需要做一个标志(布尔值)来告诉何时存储在文件中, 此标志在 onClick()

更改

例如,

boolean recording = false;

Button button2 = (Button) findViewById(R.id.btnRecord);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
        recording = true;
        Toast.makeText(getBaseContext(), "Data Recording Started" , Toast.LENGTH_SHORT ).show();
    }
});

@Override
public void onSensorChanged(SensorEvent event) {

    Sensor sensor = event.sensor;
    a= event.values[0];
    b=event.values[1];
    c=event.values[2];
    if (sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {

        magnetismx.setText(Float.toString(event.values[0]));
        magnetismy.setText(Float.toString(event.values[1]));
        magnetismz.setText(Float.toString(event.values[2]));

        if(!recording){
            return;
        }

        try {
            writeToCsv(Float.toString(a), Float.toString(b), Float.toString(c));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

使按钮充当开关(打开、关闭)更改此

recording = true;

至此

recording = !recording ;

这将反转布尔值的当前值。 这样一键开始录制,下一键停止