Android获取不到运动步数(踩坑)
获取运动步数
使用SensorManager,也就是手机内置的传感器获取运动步数,通过该方法可获取到当前运动步数、开机后总运动步数、时间戳等数据
private SensorManager mSensorManager;
private MySensorEventListener mListener;
mListener = new MySensorEventListener();
mSensorManager.registerListener(mListener,
mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR),
SensorManager.SENSOR_DELAY_NORMAL);
mSensorManager.registerListener(mListener,
mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER),
SensorManager.SENSOR_DELAY_NORMAL);
上面代码分别获取两组数据,Sensor.TYPE_STEP_DETECTOR、Sensor.TYPE_STEP_COUNTER
Sensor.TYPE_STEP_DETECTOR:当前正在运动时返回1
Sensor.TYPE_STEP_COUNTER:返回开机以来当天总步数
class MySensorEventListener implements SensorEventListener {
@Override
public void onSensorChanged(SensorEvent event) {
System.out.println("step@@@:" + event.sensor.getType() + "--" + Sensor.TYPE_STEP_DETECTOR + "--" + Sensor.TYPE_STEP_COUNTER);
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);
mStepTV.setText(desc);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
Log.d("onAccuracyChanged", String.valueOf(accuracy));
}
}
结果数据通过mListener回调处理
需要特别注意:当手机关机重启后,运动步数会清零重置,如需准确获取当天的运动步数需做持久化处理
某些手机获取不到步数
在使用SensorManager获取步数时发现部分手机可以获取到步数,一部分手机获取不到
是因为Android10以后需要动态获取Manifest.permission.ACTIVITY_RECOGNITION权限才能正常回调步数
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){
if (ContextCompat.checkSelfPermission(this,Manifest.permission.ACTIVITY_RECOGNITION) != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this, new String[]{
Manifest.permission.ACTIVITY_RECOGNITION}, 1);
} else {
Toast toast = Toast.makeText(this, "已授权", Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
}
}