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.mzph.cn/news/724346.shtml

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

相关文章

Docker的安装跟基础使用一篇文章包会

目录 国内源安装新版本 1、清理环境 2、配置docker yum源 3、安装启动 4、启动Docker服务 5、修改docker数据存放位置 6、配置加速器 现在我们已经完成了docker的安装和初始配置。以下为基本测试使用 自带源安装的版本太低 docker官方源安装的话速度太慢了 所以本篇文…

iOS 自动化测试踩坑(一): 技术方案、环境配置与落地实践

移动端的自动化测试&#xff0c;最常见的是 Android 自动化测试&#xff0c;我个人觉得 Android 的测试优先级会更高&#xff0c;也更开放&#xff0c;更容易测试&#xff1b;而 iOS 相较于 Android 要安全稳定的多&#xff0c;但也是一个必须测试的方向&#xff0c;这个系列文…

STM32(18)I2C

串口通信缺点 一个设备就需要一个串口&#xff0c;单片机可能没有那么多串口外设 总线/非总线 主机&#xff1a;负责管理总线&#xff0c;可控制波特率、数据的通信方向 波特率&#xff1a;由主机产生波特率信号 数据的传输 每个从机都有7位地址&#xff0c;最后移位是读&a…

力扣--动态规划516.最长回文子序列

思路分析&#xff1a; 创建一个二维动态规划表dp&#xff0c;其中dp[i][j]表示在子串s[i...j]中的最长回文子序列的长度。初始化基本情况&#xff1a;对角线上的元素dp[i][i]都为1&#xff0c;因为单个字符本身就是长度为1的回文子序列。从字符串末尾向前遍历&#xff0c;填充…

IPsec VPN协议框架

IPsec是IETF&#xff08;Internet Engineering Task Force&#xff09;制定的一组开放的网络安全协议。它并不是一个单独的协议&#xff0c;而是一系列为IP网络提供安全性的协议和服务的集合&#xff0c;包括认证头AH&#xff08;Authentication Header&#xff09;和封装安全载…

第十三届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组 统计子矩阵

#include<iostream> #include<algorithm> #include<cstring> #include<string> #include<vector> #include<queue>using namespace std;int cnt,temp; int n,m,K; int a[505][505]; int pre[505][505];//二维前缀和void sol() {cin>>…

如何从产品的角度做好内容营销?媒介盒子支招

内容运营就是指将生产传播内容并进行重组&#xff0c;去满足用户的内容消费需求&#xff0c;想要提高内容运营的效果&#xff0c;媒介盒子认为可以从产品出发&#xff0c;将内容运营与品牌产品相结合。那么应该怎么做呢&#xff1f;接下来就让媒介盒子告诉你。 一、 场景化内容…

MySQL 空间碎片详解

文章目录 前言1. 空间碎片如何产生2. 空间碎片如何查看3. 空间碎片如何回收后记 前言 MySQL 数据库在运行过程中&#xff0c;随着时间的推移&#xff0c;可能会出现空间碎片的问题。空间碎片是指数据库表中不再使用的空间&#xff0c;但由于各种原因&#xff0c;这些空间并没有…

【漏洞复现】CVE-2023-27178 GDidees CMS任意文件上传漏洞复现

漏洞描述 漏洞编号&#xff1a;CVE-2023-27178 GDidees CMS是法国一款开源的网站管理工具&#xff0c;可用于创建站点、照片或视频库。GDidees CMS 3.9.1及以下版本存在任意文件上传漏洞&#xff0c;允许未经授权的攻击者上传精心构造的文件并执行任意代码。 影响版本 GDide…

国内企业怎么创建WhatsApp Business账号?

什么是WhatsApp Business 账号&#xff1f; WhatsApp是世界上最受欢迎的消息应用程序之一&#xff0c;拥有超过25亿月活用户。近年来&#xff0c;WhatsApp 推出了一项新产品——WhatsApp Business 。 那么&#xff0c;WhatsApp Business 究竟是什么呢&#xff1f;WhatsApp Bu…

【EI会议征稿通知】第四届人工智能,大数据与算法国际学术会议 (CAIBDA 2024)

第四届人工智能&#xff0c;大数据与算法国际学术会议 (CAIBDA 2024) 2024 4th International Conference on Artificial Intelligence, Big Data and Algorithms 由河南省科学院、河南大学主办&#xff0c;河南省科学院智慧创制研究所、河南大学学术发展部、河南大学人工智能…

Android工作资料,这份火爆全网的452页Android Framework内核解析

为什么想跳槽&#xff1f; 简单说一下当时的状况&#xff0c;我在这家公司做了两年多&#xff0c;这两年多完成了一个大项目&#xff0c;作为开发的核心主力&#xff0c;开发压力很大&#xff0c;特别是项目上线前的几个月是非常辛苦&#xff0c;几乎每晚都要加班到12点以后&a…

前方高能,又一波Smartbi签约喜报来袭

近期&#xff0c;交通银行、厦门国际银行、中原农业保险、江苏中天科技等多家知名企业签约Smartbi&#xff0c;携手Smartbi实现数据驱动业务新增长。 Smartbi数10年专注于商业智能BI与大数据分析软件与服务&#xff0c;为各行各业提供提供一站式商业智能平台&#xff08;PaaS&a…

Android 中get请求网络数据 详细举例

请求链接 https://api.bilibili.com/x/web-interface/ranking 1.添加网络权限 依赖等 implementation com.squareup.okhttp3:okhttp:4.9.3 implementation com.google.code.gson:gson:2.8.92.写请求类network package com.example.myapplication;import android.graphics.Bi…

前端语义化标签及实例

常用的语义化标签的以下几种&#xff1a; header、nav、article、section、aside、footer、abbr、dfn、address、del、ins、pre、meter、progress <header> 定义文章的页眉信息 <header><h1>我的网站标题</h1><nav><ul><li><a …

windows 字符编码

LPSTR char* LPCSTR const char* LPWSTR wchar_t* LPCWSTR const wchar_t* LPTSTR TCHAR* LPCTSTR const TCHAR*STD_OUTPUT_HANDLE 标准输出句柄 STD_INTPUT_HANDLE 标准输入句柄 STD_ERROR_HANDLE 标准错误句柄 windows 使用的是utf-16 linux 使用的是utf-8 wch…

4. 使用zap替换gin框架默认的日志并配置日志切割

文章目录 一、gin默认的中间件二、基于zap的中间件三、在gin项目中使用zap 本文将介绍在基于gin框架开发的项目中如何配置并使用zap来接收gin框架默认的日志以及如何配置日志切割。 我们在基于gin框架开发项目时通常都会选择使用专业的日志库来记录项目中的日志&#xff0c;go…

leancloud云存储如何接入App Inventor 2?

提问&#xff1a;leancloud如何应用到App Inventor 2&#xff1f; LeanCloud 能够高效存取海量级 JSON 对象、二进制文件、地理位置等数据。其内置的行级 ACL 权限控制&#xff0c;以及通用的用户及角色管理体系&#xff0c;可以快速实现安全而灵活的数据访问。 根据官方文档&a…

如何通过考核提高酒店人员工作积极性

近年来&#xff0c;随着旅游行业的快速发展&#xff0c;也带动了酒店业的兴盛。酒店的经营效益不仅受益于旅游业&#xff0c;同时也受制于旅游行业。由于旅游业存在明显的季节性差异&#xff0c;旅游旺季客流量多、淡季客流量少&#xff0c;造成人员忙闲不均的问题。酒店行业也…

Android岗面试12家大厂成功跳槽,万字长文

都说程序员是一个青春饭&#xff0c;而我也不知不觉进入行业七年多了&#xff0c;自己也马上要进入而立之年了。都说30岁是每个程序员必会经历的一道坎&#xff0c;而自己也快到要面对这个坎了&#xff0c;我时常会想我能不能跨个这道坎。 于是请教了一些年过30还发展很好的前辈…