众筹网站建设,wordpress部署文件,网站开发的计划书,计算机前端工资多少1、首先#xff0c;申请权限 必须声明 ACTIVITY_RECOGNITION 权限#xff0c;以便您的应用在运行 Android 10 (API 级别 29) 或更高版本的设备上使用此传感器。 Manifest.xml也记得声明 if (Build.VERSION.SDK_INT Build.VERSION_CODES.P) {Log.d(TAG, [权限]申请权限 必须声明 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 ListString 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 ArrayListString();Button btfindViewById(R.id.bt_dsp); // 开始显示加速度bt.setOnClickListener(this); // 设置监听Button bt_stopfindViewById(R.id.bt_stop); // 停止显示加速度bt_stop.setOnClickListener(this); // 设置监听tvxfindViewById(R.id.tvx); // x轴tvyfindViewById(R.id.tvy); // y轴tvzfindViewById(R.id.tvz); // z轴stepfindViewById(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(ListString 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 filenew File(path,time_pixel2_B.csv);if(!file.exists()){file.createNewFile();}BufferedWriter bw new BufferedWriter(new FileWriter(file, true));int i;for(i0;iLS.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_widthmatch_parentandroid:layout_heightmatch_parentandroid:orientationverticalTextViewandroid:idid/tvxandroid:layout_width214dpandroid:layout_height69dpandroid:textTextViewtools:layout_editor_absoluteX117dptools:layout_editor_absoluteY100dp /TextViewandroid:idid/tvyandroid:layout_width214dpandroid:layout_height53dpandroid:textTextViewtools:layout_editor_absoluteX126dptools:layout_editor_absoluteY158dp /TextViewandroid:idid/tvzandroid:layout_width214dpandroid:layout_height53dpandroid:textTextViewtools:layout_editor_absoluteX130dptools:layout_editor_absoluteY234dp /TextViewandroid:idid/stepandroid:layout_width214dpandroid:layout_height53dpandroid:textTextViewtools:layout_editor_absoluteX130dptools:layout_editor_absoluteY234dp /Buttonandroid:idid/bt_dspandroid:layout_width131dpandroid:layout_height79dpandroid:text开始显示加速度tools:layout_editor_absoluteX115dptools:layout_editor_absoluteY444dp /Buttonandroid:idid/bt_stopandroid:layout_width217dpandroid:layout_height81dpandroid:text停止显示加速度 //LinearLayout2.3 AndroidManifest.xml
?xml version1.0 encodingutf-8?
manifest xmlns:androidhttp://schemas.android.com/apk/res/androidpackagecom.example.pdr_save_data!--申请权限--uses-permission android:nameandroid.permission.READ_EXTERNAL_STORAGE /uses-permission android:nameandroid.permission.WRITE_EXTERNAL_STORAGE /uses-permission android:nameandroid.permission.ACTIVITY_RECOGNITION/applicationandroid:allowBackuptrueandroid:iconmipmap/ic_launcherandroid:labelstring/app_nameandroid:roundIconmipmap/ic_launcher_roundandroid:supportsRtltrueandroid:themestyle/AppThemeactivity android:name.MainActivityintent-filteraction android:nameandroid.intent.action.MAIN /category android:nameandroid.intent.category.LAUNCHER //intent-filter/activity/application
/manifest3、APP使用方法 使用方法 1、点击“开始显示加速度”按钮注册 加速度传感器 和 计步器传感器采集模式为SensorManager.SENSOR_DELAY_NORMAL以回调的形式监听这两个传感器的 event若获取了存取权限还会保存加速度传感器xyz三轴的数据到csv文件中保存在“手机存储根目录/pdr_ZL/”中 2、行走一定步数 3、点击“停止显示加速度”按钮取消传感器的注册根据计步器传感器的取消注册时的步数和注册时的步数相减行走步数显示到如图“25”的位置
说明根据实验结果使用Google Pixel2手机的计步器传感器计算行走步数具有一定的准确性可供参考