安卓計步器的簡單實現


參考鏈接: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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM