Android使用Sensor.TYPE_STEP_COUNTER计步器传感器进行步数统计

1、首先,申请权限

        必须声明 ACTIVITY_RECOGNITION 权限,以便您的应用在运行 Android 10 (API 级别 29) 或更高版本的设备上使用此传感器。

        Manifest.xml也记得声明

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {Log.d(TAG, "[权限]" + "ACTIVITY_RECOGNITION 未获得");if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACTIVITY_RECOGNITION) != PackageManager.PERMISSION_GRANTED) {// 检查权限状态if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACTIVITY_RECOGNITION)) {//  用户彻底拒绝授予权限,一般会提示用户进入设置权限界面Log.d(TAG, "[权限]" + "ACTIVITY_RECOGNITION 以拒绝,需要进入设置权限界面打开");} else {//  用户未彻底拒绝授予权限ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACTIVITY_RECOGNITION}, 1);Log.d(TAG, "[权限]" + "ACTIVITY_RECOGNITION 未彻底拒绝拒绝,请求用户同意");}
//                return;}else{Log.d(TAG, "[权限]" + "ACTIVITY_RECOGNITION ready");}}else{}@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (requestCode == 1) {for (int i = 0; i < permissions.length; i++) {if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {// 申请成功Log.d(TAG, "[权限]" + "ACTIVITY_RECOGNITION 申请成功");} else {// 申请失败Log.d(TAG, "[权限]" + "ACTIVITY_RECOGNITION 申请失败");}}}}

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;  // 记录最后一次计步器返回的值@Overrideprotected 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

<LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:id="@+id/tvx"android:layout_width="214dp"android:layout_height="69dp"android:text="TextView"tools:layout_editor_absoluteX="117dp"tools:layout_editor_absoluteY="100dp" /><TextViewandroid:id="@+id/tvy"android:layout_width="214dp"android:layout_height="53dp"android:text="TextView"tools:layout_editor_absoluteX="126dp"tools:layout_editor_absoluteY="158dp" /><TextViewandroid:id="@+id/tvz"android:layout_width="214dp"android:layout_height="53dp"android:text="TextView"tools:layout_editor_absoluteX="130dp"tools:layout_editor_absoluteY="234dp" /><TextViewandroid:id="@+id/step"android:layout_width="214dp"android:layout_height="53dp"android:text="TextView"tools:layout_editor_absoluteX="130dp"tools:layout_editor_absoluteY="234dp" /><Buttonandroid:id="@+id/bt_dsp"android:layout_width="131dp"android:layout_height="79dp"android:text="开始显示加速度"tools:layout_editor_absoluteX="115dp"tools:layout_editor_absoluteY="444dp" /><Buttonandroid: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"/><applicationandroid: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手机的计步器传感器计算行走步数具有一定的准确性,可供参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/270643.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

虚拟化之CPU

一 cpu 1 如何查看内核版本&#xff1a;uname -r 2 如何查看操作系统的发行版本&#xff1a;cat /etc/redhat-release 3 计算机系统子的系统 cpu处理器memory内存storage存储network 网络Display显示 4 进程模式 用户模式&#xff08;user mode&#xff09;主要处理I/O的模…

CTP-API开发系列之四:接口对接准备

CTP-API开发系列之四&#xff1a;接口对接准备 CTP-API开发系列之四&#xff1a;接口对接准备CTP-API文件清单CTP-API通用规则命名规则Spi与Api CTP-API通讯模式开发语言选择 CTP-API开发系列之四&#xff1a;接口对接准备 CTP-API文件清单 文件名说明ThostFtdcTraderApi.h交…

微前端之什么是微前端

什么是微前端 微前端分类 基于路由的微前端&#xff1a;组件化微前端&#xff1a;iframe嵌入式微前端&#xff1a; 优点缺点 动态加载/懒加载微前端&#xff1a;微应用容器化方案&#xff1a; 微前端解决方案 single-spa阿里巴巴 Cloud Alfaiframe 方案Web ComponentsModule Fe…

kafka消费端消息去重方案

背景 我们在日常工作中&#xff0c;消费kafka消息是一个最常见的操作&#xff0c;不过由于kafka队列中经常包含重复的消息&#xff0c;并且消息量巨大&#xff0c;所以我们消费端总是需要先把消息进行去重后在消费&#xff0c;以减少消费端的压力&#xff0c;那么日常中我们一…

Android视角看鸿蒙第一课(工程目录)

Android视角看鸿蒙第一课&#xff08;工程目录&#xff09; 导读 鸿蒙马上就来了&#xff0c;这个工作很有可能落到Android开发的头上&#xff0c;既是机遇也是挑战&#xff0c;希望能跟上时代的浪潮&#xff0c;迫不得已开始学习鸿蒙开发&#xff0c;顺带分享记录下 我的学…

四、神经网络语言模型(NNLM)

神经网络&#xff08;Neural Network&#xff0c;NN&#xff09;主要由输入层、隐藏层、输出层构成&#xff0c;输入层的的节点数等于待处理数据中输入变量的个数&#xff08;每一个变量代表了一个特征&#xff09;&#xff0c;输出层的节点数等于与每个输入变量关联的输出的数…

docker mysql主从复制

新建主服务器容器实例3301 mysql 主 3301 docker run -p 3301:3306 --name mysql-master \ -v /mydata/mysql-master/log:/var/log/mysql \ -v /mydata/mysql-master/data:/var/lib/mysql \ -v /mydata/mysql-master/conf:/etc/mysql \ -v /home/mysql/mysql-files:/var/lib/…

微信小程序开发学习笔记《18》uni-app框架-网络请求与轮播图

微信小程序开发学习笔记《18》uni-app框架-网络请求 博主正在学习微信小程序开发&#xff0c;希望记录自己学习过程同时与广大网友共同学习讨论。建议仔细阅读uni-app对应官方文档 一、下载网络请求包 这个包是以前黑马程序员老师写的一个包&#xff0c;跟着课程学习&#x…

【仿真总结】基于matlab的传递函数计算与绘图

前言 在DC-DC电路控制算法中&#xff0c;PID控制是最常见且实用的&#xff0c;但实现前提有二&#xff0c;一是需要手算电路传递函数&#xff0c;二是需要将实际电路元件数值代入计算&#xff0c;第一步无法避免&#xff0c;但是在进行第二步时&#xff0c;存在大量基础、细致的…

Qt入门(一)Qt概述

Qt是什么&#xff1f; Qt是一个跨平台应用开发框架。 Qt既包括了一系列的Qt库&#xff0c;还包括诸多配套的开发工具如QtCreater&#xff0c;GUI Designer。Qt本身是由C开发的&#xff0c;但是也提供了其他编程语言的接口。 Qt的定位以及同类 学一种技术&#xff0c;最重要的是…

蓝桥杯-Set

目录 HashSet类常用方法 1 add(Object obj)方法 2 size() 方法 3 remove(Object obj)方法 4 contains()方法 5 clear() 方法 例题实战 set 一个不允许出现重复的元素&#xff0c;并且无序的集合&#xff0c;主要有HashSet实现类。 在判断重复元素的时候&#xff0c;Set集…

基于Python实现银行卡识别

在本文中将介绍如何使用Python和深度学习技术来实现银行卡识别功能。银行卡识别是一个在金融、安全等领域具有重要应用的问题&#xff0c;将使用深度学习模型来实现银行卡图像的识别和分类。 目录 引言数据集准备预处理和特征提取模型选择与训练模型评估与性能优化部署与应用 引…

第三百八十六回

文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了Snackbar Widget相关的内容,本章回中将介绍TimePickerDialog Widget.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在这里说的TimePickerDialog是一种弹出窗口&#xff0c;只不过窗口的内容固定显示…

[Redis]——数据一致性,先操作数据库,还是先更新缓存?

目录 一、操作缓存和数据库时有三个问题需要考虑&#xff1a; 1.删除缓存还是更新缓存&#xff1f; 2.如何保证缓存与数据库的操作同时成功或失效 3.先操作缓存还是先操作数据库&#xff08;多线程并发问题&#xff09; 二、 缓存更新的最佳策略 一、操作缓存和数据库时有…

heic怎么转换成jpg?3个方法帮你一键批量转换

heic怎么转换成jpg&#xff1f;在日常生活中&#xff0c;将HEIC转换为JPG可以为我们带来诸多便利。JPG格式作为一种广泛被接受的图片格式&#xff0c;不仅兼容性更强&#xff0c;还能在各种设备和平台上顺畅显示。这意味着&#xff0c;无论是上传到社交媒体&#xff0c;还是发送…

观其大略之HybridCLR学习笔记

问题背景 1 现有热更方案的开发效率、性能没有到达极限&#xff0c;还有提升的空间 2 ios多平台政策导致热更新受限问题&#xff0c;ios禁止jit。根据我查找的资料&#xff0c;ios的代码段启动的时候就确定了&#xff0c;不能增加新的代码段。IOS封了内存&#xff08;或者堆&…

MySQL基础-----SQL语句之DDL数据定义语句

目录 前言 开启登录数据库 一、数据库操作 1.查询所有数据库 2.切换使用数据库 3.查询当前使用的数据库 4.创建数据库 创建一个hello数据库, 使用数据库默认的字符集。 创建一个itheima数据库&#xff0c;并且指定字符集 5.删除数据库 二、表操作 1.查询当前数据库所有…

html样式排版

<template><div class"box"><div class"header">头部</div><div class"main"><div class"left">菜单</div><div class"right"><div class"right-contentr"&g…

可调恒定电流稳压器NSI50150ADT4G车规级LED驱动器 提供专业的汽车级照明解决方案

NSI50150ADT4G产品概述&#xff1a; NSI50150ADT4G可调恒定电流稳压器 (CCR) &#xff0c;是一款简单、经济和耐用的器件&#xff0c;适用于为 LED 中的调节电流提供成本高效的方案&#xff08;与恒定电流二极管 CCD 类似&#xff09;。该 (CCR) 基于自偏置晶体管 (SBT) 技术&…

thinkphp学习12-数据库的时间查询

传统方式 可以使用>、<、>、<来筛选匹配时间的数据&#xff1b; public function index() {$res Db::name(user)->where(create_time, >, 2018-1-1)->select();dump($res); }可以使用 between 关键字来设置时间的区间&#xff1b; public function in…