Android计步器的原理其实是通过手机的前后摆动模拟步伐节奏的监测。Android中与计步器有关的传感器有两个,一个是步行检测(TYPE_STEP_DETECTOR),另一个是步行计数(TYPE_STEP_COUNTER)。其中,步行检测的返回值为1时,表示当前检测到一个步伐;步行计数的返回值是累加后的数值,表示本次开机激活后的总步伐数。
- layout/activity_main.xml界面布局代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/tv_step"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="走一走,看看有什么"
android:textSize="20sp" />
</LinearLayout>
- MainActivity.java逻辑代码如下:
package com.fukaimei.steptest;
import java.util.List;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity implements SensorEventListener {
private TextView tv_step;
private SensorManager mSensroMgr;
private int mStepDetector = 0;
private int mStepCounter = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_step = (TextView) findViewById(R.id.tv_step);
mSensroMgr = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
}
@Override
protected void onPause() {
super.onPause();
mSensroMgr.unregisterListener(this);
}
@Override
protected void onResume() {
super.onResume();
int suitable = 0;
List<Sensor> sensorList = mSensroMgr.getSensorList(Sensor.TYPE_ALL);
for (Sensor sensor : sensorList) {
if (sensor.getType() == Sensor.TYPE_STEP_DETECTOR) {
suitable += 1;
} else if (sensor.getType() == Sensor.TYPE_STEP_COUNTER) {
suitable += 10;
}
}
if (suitable/10>0 && suitable%10>0) {
mSensroMgr.registerListener(this,
mSensroMgr.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR),
SensorManager.SENSOR_DELAY_NORMAL);
mSensroMgr.registerListener(this,
mSensroMgr.getDefaultSensor(Sensor.TYPE_STEP_COUNTER),
SensorManager.SENSOR_DELAY_NORMAL);
} else {
tv_step.setText("当前设备不支持计步器,请检查是否存在步行检测传感器和计步器传感器");
}
}
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_STEP_DETECTOR) {
if (event.values[0] == 1.0f) {
mStepDetector++;
}
} else if (event.sensor.getType() == Sensor.TYPE_STEP_COUNTER) {
mStepCounter = (int) event.values[0];
}
String desc = String.format("设备检测到您当前走了%d步,总计数为%d步",
mStepDetector, mStepCounter);
tv_step.setText(desc);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}
注意:安装的手机必须要含有步行检测(TYPE_STEP_DETECTOR)和步行计数(TYPE_STEP_COUNTER)传感器才能监测步数和计步。
Demo程序运行效果界面截图如下: