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