Android Sensor.TYPE_STEP_COUNTER 计步器传感器 步数统计
注意:使用 计步器传感器 Sensor.TYPE_STEP_COUNTER 获取步数前需要手机支持该传感器
1、学习资料
1.1 SENSOR.TYPE_STEP_COUNTER

翻译:
描述步数计数器传感器的常数。
这种类型的传感器返回自上次激活时重新启动以来用户所采取的步骤数。该值作为一个浮点数返回(小数部分设置为零),只有在系统重启时才会被重置为零。事件的时间戳设置为采取该事件的最后一步的时间。该传感器采用硬件实现,预计功耗较低。如果您想在长时间内持续跟踪步数,请不要取消该传感器的注册,这样即使AP处于挂起模式,它也会在后台计算步数,并在AP唤醒时报告累计计数。应用程序需要为该传感器保持注册,因为如果未激活,步数计数器将不计算步数。这种传感器是理想的健身跟踪应用。它被定义为Sensor#REPORTING_MODE_ON_CHANGE传感器。
该传感器需要权限android.permission.ACTIVITY_RECOGNITION。
看 SensorEvent.values 以获取更多详细信息。
常量:19 (0x00000013)
1.2 传感器返回值

说明:Sensor.TYPE_STEP_COUNTER的 event 中只含有一个float,其代表了已激活传感器最后一次重新启动以来用户迈出的步数
2、Android代码
主要是:MainActivity.java、activity_main.xml、AndroidManifest.xml
2.1 MainActivity.java
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.os.Environment;
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.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.util.Log;
import android.widget.Toast;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.Scanner;
import  java.util.List;
public class MainActivity extends AppCompatActivity implements SensorEventListener,View.OnClickListener {
    private SensorManager mSensorMgr;
    private  TextView tvx;
    private  TextView tvy;
    private  TextView tvz;
    private  TextView step;
    private  List<String> LS;
    private boolean s;  // 记录是否开始
    private int s1;  // 开始后,记录第一次计步器返回的值
    private int s2;  // 记录最后一次计步器返回的值
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        LS = new ArrayList<String>();
        Button bt=findViewById(R.id.bt_dsp);  // 开始显示加速度
        bt.setOnClickListener(this);  // 设置监听
        Button bt_stop=findViewById(R.id.bt_stop);  // 停止显示加速度
        bt_stop.setOnClickListener(this);  // 设置监听
        tvx=findViewById(R.id.tvx);  // x轴
        tvy=findViewById(R.id.tvy);  // y轴
        tvz=findViewById(R.id.tvz);  // z轴
        step=findViewById(R.id.step);  // 步数统计
        mSensorMgr=(SensorManager)getSystemService(Context.SENSOR_SERVICE);  // 获取服务
    }
    protected void onPause()
    {
        super.onPause();
        mSensorMgr.unregisterListener(this);  // 取消监听
    }
    protected void onResume()
    {
        super.onResume();
    }
    protected void onStop()
    {
        super.onStop();
        mSensorMgr.unregisterListener(this);  // 取消监听
    }
    @SuppressLint("SetTextI18n")
    public void onSensorChanged(SensorEvent event)  // 监听数据变化
    {
        if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
            float[] values = event.values;
            tvx.setText("ACC_X: "+Float.toString(values[0]));
            tvy.setText("ACC_Y: "+Float.toString(values[1]));
            tvz.setText("ACC_Z: "+Float.toString(values[2]));
            String s = ""; // 保存数据到字符串中
            s = System.currentTimeMillis()+","+Float.toString(values[0])+","+Float.toString(values[1])+","+Float.toString(values[2]);
            LS.add(s);
        }
        if(event.sensor.getType() == Sensor.TYPE_STEP_COUNTER){
            float[] values = event.values;
            step.setText(Float.toString(values[0]));
            if(s){  // 点击开始
                s1 = (int) values[0];
                s = false;
            }
            s2 = (int) values[0];
            int st = s2 - s1;
            step.setText(Integer.toString(st));
//            Log.d("步数计数器",Float.toString(values[0]));
        }
    }
    public void onAccuracyChanged(Sensor sensor,int accuracy)
    {//不用处理,空着就行
        return ;
    }
    private static final String TAG = "ACCCollection:";
    public static void writeLS(List<String> LS) {
        try {
            String path = Environment.getExternalStorageDirectory().getAbsolutePath()+"/pdr_ZL/";
            File folde = new File(path);
            Log.i(TAG, "write: -------1");
            if (!folde.exists() || !folde.isDirectory())
            {
                Log.i(TAG, "write: --------2");
                folde.mkdirs();
            }
            Date date = new Date();
            @SuppressLint("SimpleDateFormat") SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String time = sdf.format(date);
            File file=new File(path,time+"_pixel2_B.csv");
            if(!file.exists())
            {
                file.createNewFile();
            }
            BufferedWriter bw = new BufferedWriter(new FileWriter(file, true));
            int i;
            for(i=0;i<LS.size();i++)
            {
                bw.write(LS.get(i));
                bw.newLine(); // 行换行
            }
            bw.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
    public void onClick(View v)  //监听函数
    {
        if(v.getId() == R.id.bt_dsp)  // 开始显示加速度
        {
            s = true;  // 点击开始记录
            mSensorMgr.unregisterListener(this,mSensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER));
            mSensorMgr.unregisterListener(this,mSensorMgr.getDefaultSensor(Sensor.TYPE_STEP_COUNTER));
            //注册加速度传感器
            mSensorMgr.registerListener(this,
                    mSensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
            //注册步数统计传感器
            mSensorMgr.registerListener(this,
                    mSensorMgr.getDefaultSensor(Sensor.TYPE_STEP_COUNTER),SensorManager.SENSOR_DELAY_NORMAL);
            LS.clear();
            return;
        }
        if(v.getId() == R.id.bt_stop)  // 停止监听
        {
            mSensorMgr.unregisterListener(this);
            writeLS(LS);
            return;
        }
    }
}
2.2 activity_main.xml
<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        >
        <TextView
            android:id="@+id/tvx"
            android:layout_width="214dp"
            android:layout_height="69dp"
            android:text="TextView"
            tools:layout_editor_absoluteX="117dp"
            tools:layout_editor_absoluteY="100dp" />
        <TextView
            android:id="@+id/tvy"
            android:layout_width="214dp"
            android:layout_height="53dp"
            android:text="TextView"
            tools:layout_editor_absoluteX="126dp"
            tools:layout_editor_absoluteY="158dp" />
        <TextView
            android:id="@+id/tvz"
            android:layout_width="214dp"
            android:layout_height="53dp"
            android:text="TextView"
            tools:layout_editor_absoluteX="130dp"
            tools:layout_editor_absoluteY="234dp" />
        <TextView
            android:id="@+id/step"
            android:layout_width="214dp"
            android:layout_height="53dp"
            android:text="TextView"
            tools:layout_editor_absoluteX="130dp"
            tools:layout_editor_absoluteY="234dp" />
        <Button
            android:id="@+id/bt_dsp"
            android:layout_width="131dp"
            android:layout_height="79dp"
            android:text="开始显示加速度"
            tools:layout_editor_absoluteX="115dp"
            tools:layout_editor_absoluteY="444dp" />
        <Button
            android:id="@+id/bt_stop"
            android:layout_width="217dp"
            android:layout_height="81dp"
            android:text="停止显示加速度" />
    </LinearLayout>
2.3 AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.pdr_save_data">
    <!--申请权限-->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>
3、APP使用方法

使用方法:
1、点击“开始显示加速度”按钮,注册 加速度传感器 和 计步器传感器,采集模式为SensorManager.SENSOR_DELAY_NORMAL,以回调的形式监听这两个传感器的 event(若获取了存取权限,还会保存加速度传感器xyz三轴的数据到csv文件中,保存在“手机存储根目录/pdr_ZL/”中);
2、行走一定步数;
3、点击“停止显示加速度”按钮,取消传感器的注册,根据计步器传感器的取消注册时的步数和注册时的步数相减,行走步数显示到如图“25”的位置
说明:根据实验结果,使用Google Pixel2手机的计步器传感器计算行走步数具有一定的准确性,可供参考
Android Sensor.TYPE_STEP_COUNTER 计步器传感器 步数统计的更多相关文章
- Android开发者指南-方位传感器-Position Sensor
		
Android开发者指南-方位传感器-Position Sensor 转载自:http://blog.sina.com.cn/s/blog_48d4913001010zsu.html Position ...
 - Android超精准计步器开发-Dylan计步
		
转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/52868803 本文出自[DylanAndroid的博客] Android超精准 ...
 - Android学习笔记--获取传感器信息
		
相关资料: 传感器的坐标与读数:http://www.cnblogs.com/mengdd/archive/2013/05/19/3086781.html 传感器介绍及指南针原理:http://www ...
 - Android开发手记(22) 传感器的使用
		
Android的传感器主要包括八大传感器,他们分别是:加速度传感器(accelerometer).陀螺仪(gyroscope).方向传感器(orientation).磁力传感器(magnetic fi ...
 - Android开发10:传感器器及地图相关应用
		
前言 啦啦啦~各位小伙伴们好~经过这一学期的Android知识的学习,我们学到了很多和Android开发相关的知识,这一学期的学习也要告一段落了. 一起进入我们今天的相关内容~这次我们将一起学习使用 ...
 - android sensor架构
		
Android Sensor 架构深入剖析 作者:倪键树,华清远见嵌入式学院讲师. 1.Android sensor架构 Android4.0系统内置对传感器的支持达13种,它们分别是:加速度传感器 ...
 - (转)Android开发--常用的传感器总结
		
随着手机的发展,现在各大手机支持的传感器类型也越来越多,在开发中利用传感器进行某些操作令人们有一种耳目一新的感觉,例如微信中的摇一摇,以及手机音乐播放器中的摇一摇切歌.今天来简单介绍下Android中 ...
 - Android sensor 系统框架 (一)
		
这几天深入学习了Android sensor框架,以此博客记录和分享分析过程,其中难免会有错误的地方,欢迎指出! 这里主要分析KERNEL->HAL->JNI这3层的流程.主要从以下几方面 ...
 - Android Sensor 架构深入剖析【转】
		
本文转载自: 1.Android sensor架构 Android4.0系统内置对传感器的支持达13种,它们分别是:加速度传感器 (accelerometer).磁力传感器(magnetic fiel ...
 
随机推荐
- Linux 三剑客之sed
			
目录 Linux 三剑客之sed 命令补充: sort命令 uniq命令 cut命令 tr命令 wc命令 三剑客 - sed 编辑模式: 定位分类: 实例如下: d模式--删除模式 p模式--打印 a ...
 - LuoguP7869 「Wdoi-4」使用三个系统程度的能力 题解
			
Content 现在有一个转换后的文本文件,以一个长度为 \(n\) 的字符串表示.请判断这个文件是用哪一种写的,详情请返回题面. 数据范围:\(n\leqslant 10^5\).字符串里面至少有一 ...
 - video标签实现多个视频循环播放
			
<head> <!-- If you'd like to support IE8 (for Video.js versions prior to v7) --> </he ...
 - 【LeetCode】788. Rotated Digits 解题报告(Python)
			
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
 - 【LeetCode】454. 4Sum II 解题报告(Python & C++)
			
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典 日期 题目地址:https://leetcod ...
 - 【LeetCode】589. N-ary Tree Preorder Traversal 解题报告 (Python&C++)
			
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 迭代 日期 题目地址:https://leetc ...
 - 【LeetCode】623. Add One Row to Tree 解题报告(Python)
			
[LeetCode]623. Add One Row to Tree 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://leetcode.com/problem ...
 - 【剑指Offer】最小的K个数 解题报告(Python)
			
[剑指Offer]最小的K个数 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目 ...
 - Hexo添加Live2D看板娘+模型预览
			
文章目录 添加和注意事项 模型预览 live2d-widget-model-chitose live2d-widget-model-epsilon2_1 live2d-widget-model-gf ...
 - 第四十七个知识点:什么是Fiat-Shamir变换?
			
第四十七个知识点:什么是Fiat-Shamir变换? 只要Alice和Bob同时在线,Sigma协议能快速的完成Alice向Bob证明的任务.Alice向Bob发送承诺,Bob返回一个挑战,最后Ali ...