跑步-计步器实现(一)

457 阅读2分钟

android 系统在硬件上,从4.4开始,提供了很多传感器的功能,方便我们根据这些功能实现我们想要的效果,例如:游戏重力感应,方向等等。这其中包含了: Android 平台支持三大类传感器:

  • 动态传感器这类传感器测量三个轴向上的加速力和旋转力。这个类别中包含加速度计、重力传感器、陀螺仪和旋转矢量传感器。
  • 环境传感器这类传感器测量各种环境参数,如环境气温、气压、照度和湿度。这个类别中包含气压计、光度计和温度计。
  • 位置传感器这类传感器测量设备的物理位置。这个类别中包含屏幕方向传感器和磁力计。

我们可以参考官方对传感器的一些介绍:传感器

image.png 我们可以利用 Android 传感器框架访问设备上提供的传感器并获取原始传感器数据。传感器框架提供多个类和接口,来执行各种与传感器相关的任务。

一、反编译看看其他应用怎么实现的 在jadxTools 工具中,我们在乐动力apk 中找到了一段关键代码:

image.png

可以看到,他的实现步骤非常简单 1、第一步获取 SensorManager

 private SensorManager mSensorManager = (SensorManager) GlobalConfig.getAppContext().getSystemService("sensor");

2、第二步监听SensorEventListener

 this.mSensorManager.registerListener(this, this.mSensor, 0);

3、第三步回调判断onSensorChanged(SensorEvent sensorEvent)

image.png 以上3步是一个比较简单的步数移动判断,由此,我们可以进一步对数据进行处理,过滤不是真正移动的步数。

二、步数的过滤

还是利用jadxTools,我们来看看某跑步app是怎么处理的XXXPedometer

image.png

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