安卓计步器的简单实现

参考链接:https://blog.csdn.net/fjnu_se/article/details/90906209

大体思路:在参考链接的基础上,我去掉了显示时间的线程。用android自带计步传感器进行计步,用一个数据库存储每日0点时计步器的总步数,由此可以计算出当日的步数。如果手机重启过,就清除掉所有的旧记录。现有问题是只有在app运行的情况下才能把当日0点时计步器的总步数加入数据库。

运行效果图:

结构目录:

activity_main.xml:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     xmlns:app="http://schemas.android.com/apk/res-auto"
 4     xmlns:tools="http://schemas.android.com/tools"
 5     android:layout_width="match_parent"
 6     android:layout_height="match_parent"
 7     tools:context=".MainActivity">
 8
 9     <ScrollView
10         android:layout_width="match_parent"
11         android:layout_height="wrap_content">
12     </ScrollView>
13
14     <ListView
15         android:id="@+id/listview"
16         android:layout_width="match_parent"
17         android:layout_height="400dp">
18     </ListView>
19
20     <TextView
21         android:id="@+id/steps"
22         android:layout_below="@+id/listview"
23         android:textSize="25dp"
24         android:layout_width="wrap_content"
25         android:layout_height="wrap_content"
26         android:layout_gravity="center_horizontal" />
27
28 </RelativeLayout>
MainActivity:
  1 package com.mingrisoft.countsteps;
  2
  3 import android.content.ContentValues;
  4 import android.database.Cursor;
  5 import android.database.sqlite.SQLiteDatabase;
  6 import android.hardware.Sensor;
  7 import android.hardware.SensorEvent;
  8 import android.hardware.SensorEventListener;
  9 import android.hardware.SensorManager;
 10 import android.os.Handler;
 11 import android.os.Message;
 12 import android.provider.ContactsContract;
 13 import android.provider.ContactsContract.Data;
 14 import android.provider.FontsContract;
 15 import android.sax.EndElementListener;
 16 import android.support.v7.app.AppCompatActivity;
 17 import android.os.Bundle;
 18 import android.text.format.DateFormat;
 19 import android.util.Log;
 20 import android.widget.TextView;
 21
 22 import java.text.SimpleDateFormat;
 23 import java.util.Date;
 24 import java.util.List;
 25
 26 public class MainActivity extends AppCompatActivity implements SensorEventListener{//不实现SensorEventListener接口在真机上会闪退
 27     SensorManager mSensorManager;//管理器实例
 28     Sensor stepCounter;//传感器
 29     float mSteps;//截止当天0点时步数/重启手机到当前为止的步数
 30     TextView steps;//显示步数
 31     TextView time;//显示时间
 32     private DBOpenHelper dbOpenHelper;//定义DBOpenHelper
 33
 34     @Override
 35     protected void onCreate(Bundle savedInstanceState) {
 36         super.onCreate(savedInstanceState);
 37         setContentView(R.layout.activity_main);
 38
 39         // 获取SensorManager管理器实例
 40         mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
 41         dbOpenHelper = new DBOpenHelper(MainActivity.this,"db_step",null,1);
 42         steps = (TextView)findViewById(R.id.steps);
 43         time = (TextView)findViewById(R.id.time);
 44
 45         // 获取计步器sensor
 46         stepCounter = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);
 47         if(stepCounter != null){
 48             // 如果sensor找到,则注册监听器
 49             mSensorManager.registerListener((SensorEventListener) this,stepCounter,mSensorManager.SENSOR_DELAY_GAME);
 50         }
 51         else{
 52             Log.e("hemeiwolong","no step counter sensor found");
 53         }
 54     }
 55
 56     //步数变化时
 57     public void onSensorChanged(SensorEvent event) {
 58         Cursor cursor = dbOpenHelper.getReadableDatabase().query("tb_step",null,null, null, null,null,null);
 59 //        while (cursor.moveToNext()) {
 60 //            Log.i("fffff", cursor.getString(0) + cursor.getString(1) + cursor.getString(2));
 61 //        }
 62         //获取今天的日期,统一格式为yyyy/MM/dd
 63         String strdate = new SimpleDateFormat("yyyy/MM/dd").format(new Date());
 64
 65         if (cursor.getCount() == 0) {   //如果计步表为空,则把现在为止的总步数加入数据库
 66             insertData(dbOpenHelper.getReadableDatabase(), strdate, String.valueOf(event.values[0]));
 67             mSteps = event.values[0];
 68         } else {
 69             if (cursor.moveToLast()) {
 70                 if (event.values[0] < Float.parseFloat(cursor.getString(2))) {  //说明手机重启过
 71                     //删除旧的所有步数记录,把现在的总步数加入数据库,注意表名打错的话会闪退
 72                     dbOpenHelper.getReadableDatabase().delete("tb_step",null,null);
 73                     insertData(dbOpenHelper.getReadableDatabase(), strdate, String.valueOf(event.values[0]));
 74
 75                     if (cursor.moveToLast()) {
 76                         mSteps = Float.parseFloat(cursor.getString(2));
 77                     }
 78                 } else {    //如果今天没重启过,则取最新的数据作为今天计步的起始值
 79                     mSteps = Float.parseFloat(cursor.getString(2));
 80                 }
 81             }
 82         }
 83
 84         //今天所走步数 = 目前的总步数 - 今天0点为止的总步数,如果今天重启过,只记录重启到现在所走的步数
 85         float showSteps = event.values[0] - mSteps;
 86         steps.setText("你已经走了"+String.valueOf((int)showSteps)+"步");
 87
 88         //到了0点,把到目前为止所走的总步数加入数据库
 89         String time = "00:00:00";
 90         if (time.equals(new SimpleDateFormat("HH:mm:ss").format(new Date()))){
 91             insertData(dbOpenHelper.getReadableDatabase(), strdate, String.valueOf(event.values[0]));
 92             mSteps = event.values[0];
 93         }
 94     }
 95
 96     @Override
 97     public void onAccuracyChanged(Sensor sensor, int accuracy) {
 98
 99     }
100
101     //向数据库添加记录
102     private void insertData(SQLiteDatabase sqLiteDatabase, String day, String steps) {
103         ContentValues contentValues = new ContentValues();
104         contentValues.put("day", day);
105         contentValues.put("steps", steps);
106
107         sqLiteDatabase.insert("tb_step",null,contentValues);
108     }
109 }
DBOpenHelper:
 1 package com.mingrisoft.countsteps;
 2
 3 import android.content.Context;
 4 import android.database.sqlite.SQLiteDatabase;
 5 import android.database.sqlite.SQLiteOpenHelper;
 6 import android.util.Log;
 7
 8 public class DBOpenHelper extends SQLiteOpenHelper {
 9     //定义创建计步表的SQL语句,每列内容分别为序号,日期,步数
10     final String CREATE_STEPS = "create table tb_step (_id integer primary key autoincrement," +
11             "day, steps)";
12
13     //重写构造方法,并设置工厂为null
14     public DBOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
15         super(context, name, null, version);
16     }
17
18     //创建计步表
19     @Override
20     public void onCreate(SQLiteDatabase db) {
21         db.execSQL(CREATE_STEPS);
22     }
23
24     //重写基类的onUpgrade()方法,以便数据库版本更新
25     @Override
26     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
27         Log.i("计步表","版本更新"+oldVersion+"-->"+newVersion);
28     }
29 }
manifests:
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 3     package="com.mingrisoft.countsteps">
 4
 5     <uses-feature android:name="android.hardware.sensor.stepcounter"/>
 6     <uses-feature android:name="feature:android.hardware.sensor.stepdetector"/>
 7
 8     <application
 9         android:allowBackup="true"
10         android:icon="@mipmap/ic_launcher"
11         android:label="@string/app_name"
12         android:roundIcon="@mipmap/ic_launcher_round"
13         android:supportsRtl="true"
14         android:theme="@style/AppTheme">
15         <activity android:name=".MainActivity">
16             <intent-filter>
17                 <action android:name="android.intent.action.MAIN" />
18
19                 <category android:name="android.intent.category.LAUNCHER" />
20             </intent-filter>
21         </activity>
22     </application>
23
24 </manifest>

原文地址:https://www.cnblogs.com/hemeiwolong/p/12631585.html

时间: 2024-08-30 13:11:07

安卓计步器的简单实现的相关文章

深圳市安卓工控设备有限公司简单介绍

深圳市安卓工控设备有限公司成立于二〇一三年,公司提供专业的行业定制化产品解决方式(基于安卓平台深度定制化解决方式和物联网工业控制解决方式).公司自主研发了KK系列安卓工控主板以及KC系列物联网控制模块等产品. 安卓平台深度定制化解决方式之硬件方案 安卓工控基于嵌入式ARM安卓平台技术,提供专业的软硬件产品和行业定制化解决方式.产品包含工业多点电容式人机界面(HMI),安卓行业平板(可支持NFC,ZIGBEE,3G,GPS等),工控机顶盒,工业设备控制一体机.安卓工控主板等. 安卓平台深度定制化解

ios 计步器的简单实现

随着人们生活水平的提高,加上移动技术的快速发展,越来越多的软件进军健康行业,计步器是用来记录个人运动的一项很好的技术.这段时间出于对这一技术的好奇,了解学习了一下计步器的实现过程. 计步器的实现有两种方式,(1),直接调用HealthKit框架获取苹果的健康应用数据.(2)速度传感器运动传感器\加速度传感器\加速器(Motion/Accelerometer Sensor) (1)HealthKit这种方式简单粗暴,但是也有相应的弊端,这个框架获取到的数据好像是1小时一更新,如果你的软件是想要获取

【安卓基础】简单快捷的加载中对话框

遇到的需求 项目中有些界面需要显示加载中,例如登陆界面.注册界面等等.一开始考虑找个第三方库,但是第三方库往往为了达到普遍的适用性,封装得非常复杂.有时候一个库就差不多1mb大小,这样接入成本太大了,况且一个项目还需要其他第三方库接入,如果每一个功能都用第三方库解决,势必导致开发出来的应用体积臃肿,而且难以管理结构. 而我只是需要简单展示一个加载中提示,所以自己实现一个会更加合理,而且更加小巧灵活. 方案的选择 在安卓开发中,系统提供了对话框类用于开发.所以我直接选择使用Support V7的A

安卓与HTML简单的交互使用

实现通过java代码与HTML的一个互相操作. 准备工作: 1.新建Android工程,在布局文件中添加WebView控件. 2.准备一个HTML文件,放在src/main/assets文件夹下. 3.在java中得到webview,通过loadUrl找到assets下的HTML文件,必须设置webview能使用js(settings.setJavaScriptEnabled(true))加载显示如下效果: 简单的效果实现 一.点击HTML上sayHello按钮,可以得到java代码返回的字符串

Bolts框架在安卓中的简单应用

在新公司的项目中,是由bolts框架来搭建网络请求的,由于之前没有接触过这个框架,因此只能从头看起(其实看下来相对来说我更喜欢用RxJava+Retrofit搭建apps的请求层,but,whatever...),下面的内容很多都是在网上看完资料后自己写Demo来验证获得的,部分是翻译GitHub的Bolts框架的说明文档,也有部分是我自己在网上的教程的基础上自己验证后的代码,如有雷同,纯属巧合. 1.简介 Bolts是一个用于简化移动app开发的轻量级函数库集合,是由Parse和Faceboo

安卓开发之简单的短信操作模块

最近做了一个简单的短信操作模块,比较实用小巧.主要功能是可以发送短信(包括短信发送状态的提示),储存短信(可以用于短信列表显示等等),短信的储存可以用SQLite,不过觉得也就几十条上百条短信,用SQLite未免大材小用,还麻烦,于是决定用SharePreference结合对象序列化来做这个模块. 首先是短信实体类,为了复用,做成抽象类,再具体项目中使用只要继承该抽象类即可: public abstract class Message implements Serializable{ priva

安卓来电秀简单实现

效果图[图有点浮夸,但是功能是一样的,效果差一点...]: 请不要在意这些细节: 功能描述:就是当数据库中存在的联系人打电话来的时候,在手机上显示一个界面提示相关号码的信息. 需要运用的知识:广播.Service.浮动窗口.数据库 实现的逻辑:用广播来实现监听来电的功能,在Service中调用数据库中的联系人信息,判断来电号码是否在数据库中,然后决定是否显示[来电秀] 注意:广播.Service的部分权限需要在AndroidMainfest.xml文件中注册,为了达到更好的广播监听效果:广播的注

简单好用的安卓程序开发平台E4A

E4A为安卓程序中文开发平台,开放平台搭建过程简单,安卓程序编写简单快速! E4A发布版需要收费,免费版则是附带广告的.(对于不是用于商业软件来说,使用免费版是可以的)

android源码大放送(实战开发必备),免费安卓demo源码,例子大全文件详细列表

免费安卓demo源码,例子大全文件详细列表 本列表源码永久免费下载地址:http://www.jiandaima.com/blog/android-demo 卷 yunpan 的文件夹 PATH 列表 卷序列号为 0000-73EC E:. │ jiandaima.com文件列表生成.bat │ 例子大全说明.txt │ 本例子永久更新地址~.url │ 目录列表2016.03.10更新.txt │ ├─前台界面 │ ├─3D标签云卡片热门 │ │ Android TagCloudView云标签