Android超精準計步器開發-Dylan計步

轉載請註明出處:http://blog.csdn.net/linglongxin24/article/details/52868803
本文出自【DylanAndroid的博客】


Android超精準計步器開發

親測在小米.魅族.華爲上可用,該app採用後臺service計歩服務,所以只要app不被手機殺死在後臺也是可以正常計歩的。上圖:





萬分感謝項目中使用兩位大神的算法

1.需要在AndroidManifest.xml中添加權限

    <!--計歩需要的權限-->
    <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.檢測手機是否支持計歩

 /**
     * 判斷該設備是否支持計歩
     *
     * @param context
     * @return
     */
    @TargetApi(Build.VERSION_CODES.KITKAT)
    public static boolean isSupportStepCountSensor(Context context) {
        // 獲取傳感器管理器的實例
        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;

    /**
     * 開啓計步服務
     */
    private void setupService() {
        Intent intent = new Intent(this, StepService.class);
        isBind = bindService(intent, conn, Context.BIND_AUTO_CREATE);
        startService(intent);


    }
    /**
     * 從service服務中拿到步數
     *
     * @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;
    }


    /**
     * 用於查詢應用服務(application Service)的狀態的一種interface,
     * 更詳細的信息可以參考Service 和 context.bindService()中的描述,
     * 和許多來自系統的回調方式一樣,ServiceConnection的方法都是進程的主線程中調用的。
     */
    ServiceConnection conn = new ServiceConnection() {
        /**
         * 在建立起於Service的連接時會調用該方法,目前Android是通過IBind機制實現與服務的連接。
         * @param name 實際所連接到的Service組件名稱
         * @param service 服務的通信信道的IBind,可以通過Service訪問對應服務
         */
        @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();
            }
        }

        /**
         * 當與Service之間的連接丟失的時候會調用該方法,
         * 這種情況經常發生在Service所在的進程崩潰或者被Kill的時候調用,
         * 此方法不會移除與Service的連接,當服務重新啓動的時候仍然會調用 onServiceConnected()。
         * @param name 丟失連接的組件名稱
         */
        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };

GitHub地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章