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();
}