超精準(zhǔn)的Android手機(jī)計(jì)步器開(kāi)發(fā)
親測(cè)在小米.魅族.華為上可用,該app采用后臺(tái)service計(jì)歩服務(wù),所以只要app不被手機(jī)殺死在后臺(tái)也是可以正常計(jì)歩的。上圖:



1.需要在AndroidManifest.xml中添加權(quán)限
<!--計(jì)歩需要的權(quán)限--> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-feature android:name="android.hardware.sensor.accelerometer" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <uses-feature android:name="android.hardware.sensor.stepcounter" android:required="true" /> <uses-feature android:name="android.hardware.sensor.stepdetector" android:required="true" />
2.檢測(cè)手機(jī)是否支持計(jì)歩
/**
* 判斷該設(shè)備是否支持計(jì)歩
*
* @param context
* @return
*/
@TargetApi(Build.VERSION_CODES.KITKAT)
public static boolean isSupportStepCountSensor(Context context) {
// 獲取傳感器管理器的實(shí)例
SensorManager sensorManager = (SensorManager) context
.getSystemService(context.SENSOR_SERVICE);
Sensor countSensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);
Sensor detectorSensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR);
return countSensor != null || detectorSensor != null;
}
3.功能使用
private boolean isBind = false;
private Messenger mGetReplyMessenger = new Messenger(new Handler(this));
private Messenger messenger;
/**
* 開(kāi)啟計(jì)步服務(wù)
*/
private void setupService() {
Intent intent = new Intent(this, StepService.class);
isBind = bindService(intent, conn, Context.BIND_AUTO_CREATE);
startService(intent);
}
/**
* 從service服務(wù)中拿到步數(shù)
*
* @param msg
* @return
*/
@Override
public boolean handleMessage(Message msg) {
switch (msg.what) {
case Constant.MSG_FROM_SERVER:
cc.setCurrentCount(10000, msg.getData().getInt("step"));
break;
}
return false;
}
/**
* 用于查詢應(yīng)用服務(wù)(application Service)的狀態(tài)的一種interface
* 更詳細(xì)的信息可以參考Service 和 context.bindService()中的描述
* 和許多來(lái)自系統(tǒng)的回調(diào)方式一樣,ServiceConnection的方法都是進(jìn)程的主線程中調(diào)用的
*/
ServiceConnection conn = new ServiceConnection() {
/**
* 在建立起于Service的連接時(shí)會(huì)調(diào)用該方法,目前Android是通過(guò)IBind機(jī)制實(shí)現(xiàn)與服務(wù)的連接。
* @param name 實(shí)際所連接到的Service組件名稱
* @param service 服務(wù)的通信信道的IBind,可以通過(guò)Service訪問(wèn)對(duì)應(yīng)服務(wù)
*/
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
try {
messenger = new Messenger(service);
Message msg = Message.obtain(null, Constant.MSG_FROM_CLIENT);
msg.replyTo = mGetReplyMessenger;
messenger.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
}
/**
* 當(dāng)與Service之間的連接丟失的時(shí)候會(huì)調(diào)用該方
* 這種情況經(jīng)常發(fā)生在Service所在的進(jìn)程崩潰或者被Kill的時(shí)候調(diào)用
* 此方法不會(huì)移除與Service的連接,當(dāng)服務(wù)重新啟動(dòng)的時(shí)候仍然會(huì)調(diào)用 onServiceConnected()
* @param name 丟失連接的組件名稱
*/
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
GitHub地址:https://github.com/linglongxin24/DylanStepCount
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
AndroidUI組件SlidingTabLayout實(shí)現(xiàn)ViewPager頁(yè)滑動(dòng)效果
這篇文章主要介紹了AndroidUI組件SlidingTabLayout實(shí)現(xiàn)ViewPager頁(yè)滑動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
Android開(kāi)發(fā)之HTTP訪問(wèn)網(wǎng)絡(luò)
這篇文章主要介紹了Android開(kāi)發(fā)之HTTP訪問(wèn)網(wǎng)絡(luò)的相關(guān)資料,需要的朋友可以參考下2016-07-07
使用Flutter開(kāi)發(fā)的抖音國(guó)際版實(shí)例代碼詳解
這篇文章主要介紹了使用Flutter開(kāi)發(fā)的抖音國(guó)際版,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
Flutter實(shí)現(xiàn)滾動(dòng)選擇數(shù)字
這篇文章主要為大家詳細(xì)介紹了Flutter實(shí)現(xiàn)滾動(dòng)選擇數(shù)字,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
實(shí)例詳解Android自定義ProgressDialog進(jìn)度條對(duì)話框的實(shí)現(xiàn)
這篇文章主要介紹了實(shí)例詳解Android自定義ProgressDialog進(jìn)度條對(duì)話框的實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2016-01-01
Mac Android Studio 3.0 Terminal 中文亂碼問(wèn)題處理
本文給大家分享的是在更新Android Studio 3.0之后,使用Terminal時(shí),發(fā)現(xiàn) git log 命令查看歷史 log會(huì)亂碼,以及最后的解決方法,推薦給小伙伴們2017-11-11

