Data Acquisition Method of Android Sensor

  • 2021-12-21 05:08:56
  • OfStack

In this paper, we share the specific code of Android sensor data acquisition for your reference. The specific contents are as follows

Following the wifi list acquisition in the previous article, we will continue to talk about sensors in this article. Or look at the code

Let's first define the tool class of a sensor by ourselves (because I only got some sensors here, I need to get extra sensors and configure them by myself. The tool class provides different construction methods through overloading):


public class SensorUtils implements SensorEventListener {
 
    private SensorManager manager;
 
    /**
     * @param context  Multiple sensors 
     * @param sensorList
     */
    public void RegisterSensor(Context context, List<Sensor> sensorList){
        manager = (SensorManager) context.getSystemService(SENSOR_SERVICE);
        for(Sensor sensors : sensorList){
            manager.registerListener(this,sensors,SensorManager.SENSOR_DELAY_NORMAL);
        }
    }
 
    /**
     * @param context  Single sensor 
     * @param sensor
     */
    public void RegisterSensor(Context context, Sensor sensor){
        manager = (SensorManager) context.getSystemService(SENSOR_SERVICE);
        manager.registerListener(this,sensor,SensorManager.SENSOR_DELAY_NORMAL);
    }
 
    @Override
    public void onSensorChanged(SensorEvent event) {
        switch (event.sensor.getType()){
            case Sensor.TYPE_ACCELEROMETER:
                // Set callback monitoring for acceleration sensor 
                sensorCallBack.acceleratedCallBack(event);
                break;
            case Sensor.TYPE_GYROSCOPE:
                // Set callback monitoring for gyroscope sensor 
                sensorCallBack.gyroscopeCallBack(event);
                break;
            case Sensor.TYPE_MAGNETIC_FIELD:
                // Set callback monitoring for magnetic field sensor 
                sensorCallBack.magneticFieldCallBack(event);
                break;
            case Sensor.TYPE_PRESSURE:
                // Set callback monitoring for barometer sensor 
                sensorCallBack.pressureCallBack(event);
                break;
        }
 
    }
 
    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
 
    }
 
    // Remember to cancel the registration after using it 
    public void UnRegisterSensor(){
        if (manager != null){
            manager.unregisterListener(this);
        }
    }
 
    public interface SensorCallBack{
        void acceleratedCallBack(SensorEvent event);
 
        void gyroscopeCallBack(SensorEvent event);
 
        void magneticFieldCallBack(SensorEvent event);
 
        void pressureCallBack(SensorEvent event);
    }
 
   private SensorCallBack sensorCallBack;
 
    public SensorUtils(SensorCallBack sensorCallBack){
        this.sensorCallBack = sensorCallBack;
    }
 
}

Then we use the tool class in activity:


// Initialization 
sensorUtils = new SensorUtils(this);
sensorUtils.RegisterSensor(this, sensorList);

Don't forget to implement callback listening in SensorUtil in activity


public class SensorActivity extends BaseActivity<BaseViewModel, ActivitySensorBinding> implements SensorUtils.SensorCallBack{
 
  //do something
}

Then implement the desired function in the callback listening set by yourself


@Override
    public void acceleratedCallBack(SensorEvent event) {
        // You can do what you want 
        if (event != null) {
            float[] values = event.values;
            float x1 = values[0];
            float y1 = values[1];
            float z1 = values[2];
            StringBuffer stringBuffer = new StringBuffer();
            stringBuffer.append(getString(R.string.accelerometer_number)).append("\n");
            stringBuffer.append(getString(R.string.x1)).append(x1).append("\n");
            stringBuffer.append(getString(R.string.y1)).append(y1).append("\n");
            stringBuffer.append(getString(R.string.z1)).append(z1);
            if (!viewDateBinding.scrollView.isMove()) {
                handler.post(() -> viewDateBinding.tvAccelerated.setText(stringBuffer.toString()));
            }
            if (flagAccelerated) {
                DataBassManager.getInstance(SensorActivity.this).insertSensor(new TableBean(null,stringBuffer.toString(),null,null,null));
            }
            flagAccelerated = false;
        }
    }
 
    @Override
    public void gyroscopeCallBack(SensorEvent event) {
        // You can do what you want 
        if (event != null) {
            float x2 = event.values[0];
            float y2 = event.values[1];
            float z2 = event.values[2];
            StringBuffer stringBuffer = new StringBuffer();
            stringBuffer.append(getString(R.string.gyroscope_number)).append("\n");
            stringBuffer.append(getString(R.string.x2)).append(x2).append("\n");
            stringBuffer.append(getString(R.string.y2)).append(y2).append("\n");
            stringBuffer.append(getString(R.string.z2)).append(z2);
            if (!viewDateBinding.scrollView.isMove()) {
                handler.post(() -> viewDateBinding.tvGyroscope.setText(stringBuffer.toString()));
            }
            if (flagGyroscope) {
                DataBassManager.getInstance(SensorActivity.this).insertSensor(new TableBean(null,null,stringBuffer.toString(),null,null));
            }
            flagGyroscope = false;
        }
    }
 
    @SuppressLint("DefaultLocale")
    @Override
    public void magneticFieldCallBack(SensorEvent event) {
        // You can do what you want 
        if (event != null) {
            float x3 = event.values[0];
            float y3 = event.values[1];
            float z3 = event.values[2];
            StringBuffer stringBuffer = new StringBuffer();
            stringBuffer.append(getString(R.string.magnetic_field_number)).append("\n");
            stringBuffer.append(getString(R.string.x3)).append(String.format("%.2f", x3)).append("\n");
            stringBuffer.append(getString(R.string.y3)).append(String.format("%.2f", y3)).append("\n");
            stringBuffer.append(getString(R.string.z3)).append(String.format("%.2f", z3));
            if (!viewDateBinding.scrollView.isMove()) {
                handler.post(() -> viewDateBinding.tvMagneticField.setText(stringBuffer.toString()));
            }
            if (flagMagneticField) {
                DataBassManager.getInstance(SensorActivity.this).insertSensor(new TableBean(null,null,null,stringBuffer.toString(),null));
            }
            flagMagneticField = false;
        }
    }
 
    @Override
    public void pressureCallBack(SensorEvent event) {
        // You can do what you want 
        if (event != null) {
            float x4 = event.values[0];
            String str4 = getString(R.string.pressure_number) + x4;
            if (!viewDateBinding.scrollView.isMove()) {
                handler.post(() -> viewDateBinding.tvPressure.setText(str4));
            }
            if (flagPressure) {
                DataBassManager.getInstance(SensorActivity.this).insertSensor(new TableBean(null,null,null,null,str4));
            }
            flagPressure = false;
        }
    }

In my side, the data is stored into the database through the click event of the button. Note that the callback of the sensor is real-time, so if you want to obtain a certain time, you need to judge whether you need to obtain the callback data through boolean

Finally, remember to cancel the listening, because I registered in activity, so the cancellation of registration is also done in activity:


protected void onStop() {
        super.onStop();
        sensorUtils.UnRegisterSensor();
    }

Related articles: