android 系统在硬件上,从4.4开始,提供了很多传感器的功能,方便我们根据这些功能实现我们想要的效果,例如:游戏重力感应,方向等等。这其中包含了: Android 平台支持三大类传感器:
- 动态传感器这类传感器测量三个轴向上的加速力和旋转力。这个类别中包含加速度计、重力传感器、陀螺仪和旋转矢量传感器。
- 环境传感器这类传感器测量各种环境参数,如环境气温、气压、照度和湿度。这个类别中包含气压计、光度计和温度计。
- 位置传感器这类传感器测量设备的物理位置。这个类别中包含屏幕方向传感器和磁力计。
我们可以参考官方对传感器的一些介绍:传感器
我们可以利用 Android 传感器框架访问设备上提供的传感器并获取原始传感器数据。传感器框架提供多个类和接口,来执行各种与传感器相关的任务。
一、反编译看看其他应用怎么实现的 在jadxTools 工具中,我们在乐动力apk 中找到了一段关键代码:
可以看到,他的实现步骤非常简单
1、第一步获取 SensorManager
private SensorManager mSensorManager = (SensorManager) GlobalConfig.getAppContext().getSystemService("sensor");
2、第二步监听SensorEventListener
this.mSensorManager.registerListener(this, this.mSensor, 0);
3、第三步回调判断onSensorChanged(SensorEvent sensorEvent)
以上3步是一个比较简单的步数移动判断,由此,我们可以进一步对数据进行处理,过滤不是真正移动的步数。
二、步数的过滤
还是利用jadxTools,我们来看看某跑步app是怎么处理的XXXPedometer
即,对onSensorChanged 方法,做数据计算,符合运动状态的添加到存储,不符合则过滤掉。
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
float[] fArr = sensorEvent.values;
float f2 = fArr[0] / 9.78049f;
float f3 = fArr[1] / 9.78049f;
float f4 = fArr[2] / 9.78049f;
this.t++;
if (Math.abs(System.currentTimeMillis() - this.f2055u) >= 5000) {
this.f2055u = System.currentTimeMillis();
if (this.t / 5 > 6) {
this.w = true;
} else {
this.w = false;
}
this.t = 0;
}
this.s++;
double sqrt = Math.sqrt((double) ((f2 * f2) + (f3 * f3) + (f4 * f4)));
int i2 = this.s;
// Log.e(tag,"onSensorChanged i2="+i2+" sqrt="+sqrt+" values[2]:"+f2+" values[2]:"+f3+" values[3]:"+f4);
if (((float) i2) < 125.0f) {
double d2 = (double) this.m;
this.m = (float) (d2 + sqrt);
if (this.l > sqrt) {
this.l = sqrt;
}
if (this.k < sqrt) {
this.k = sqrt;
}
this.q.add(sqrt);
// Log.e(tag,"onSensorChanged < 125.0f add sqrt="+sqrt);
} else if (((float) i2) == 125.0f) {
double d3 = (double) this.m;
this.m = (float) (d3 + sqrt);
if (this.l > sqrt) {
this.l = sqrt;
}
if (this.k < sqrt) {
this.k = sqrt;
}
this.q.add(sqrt);
// Log.e(tag,"onSensorChanged == 125.0f add sqrt="+sqrt);
g();
} else if (((float) i2) < 250.0f) {
double d4 = (double) this.p;
this.p = (float) (d4 + sqrt);
if (this.o > sqrt) {
this.o = sqrt;
}
if (this.n < sqrt) {
this.n = sqrt;
}
this.r.add(sqrt);
// Log.e(tag,"onSensorChanged <250.0f add sqrt="+sqrt);
} else if (((float) i2) == 250.0f) {
this.s = 0;
double d5 = (double) this.p;
this.p = (float) (d5 + sqrt);
if (this.o > sqrt) {
this.o = sqrt;
}
if (this.n < sqrt) {
this.n = sqrt;
}
this.r.add( sqrt );
// Log.e(tag,"onSensorChanged ==250.0f add sqrt="+sqrt);
h();
}
}