­

如何讓開發者直接在應用後台控制用戶的運動狀態?

酷暑終於過去,很多人伴着涼爽的秋風開啟了新一輪的健身計劃。當用戶進行戶外運動或使用跑步機、橢圓機等器械時,他們會希望在運動健康類App里點擊即可開啟運動並記錄運動數據。而對於開發者自己開發的應用來說,用戶在使用跟華為健康App綁定的運動設備運動時,可以直接在自己的App後台控制用戶運動狀態並獲取實時數據,不需要再從華為健康App里進行操作。

那麼,對於運動健康App來說,如何實現以上功能呢?HMS Core運動健康服務的擴展能力服務開放更多實時運動和健康數據、運動和健康解決方案場景化數據。其中控制運動並獲取實時運動數據能力提供了開始、暫停、恢復和結束運動的接口,開發者可以直接在應用內調用接口,後台控制運動健康App中對應運動狀態,無需跳轉到華為運動健康App運動界面進行操作,此時運動健康App不會彈出運動頁面,而是在後台執行。

同時華為也提供了獲取實時運動數據和停止獲取實時運動數據的接口,為防止數據丟失,一般在開始運動之前調用獲取實時運動數據接口,在停止運動之後調用停止獲取實時運動數據接口。如果用戶綁定了華為穿戴設備,啟動運動時,穿戴設備將自動進入運動界面;結束運動時,穿戴設備將自動結束運動。使用接口前,需要向華為申請開通權限,並獲取用戶授權,否則接口將調用失敗。目前支持的運動類型:戶外步行、戶外跑步、戶外騎行、室內跑步(跑步機)、橢圓機、划船機、室內單車。具體場景獲取的數據類型請參考實時運動 Bundle 對象鍵值

前台運動跳轉設備配對頁面

Demo

開發步驟

開發準備

1. 申請Health Kit服務

申請Health Kit服務前,請先完成申請帳號服務。

2 .集成 HMS Core SDK

集成SDK之前,請先集成華為帳號服務SDK

在開始開發前,請先將SDK集成到Android Studio開發環境中。Android Studio應為V3.3.2及以上版本。

開發步驟

1 .開始獲取實時運動數據

  1. 調用HiHealthDataStore對象的registerSportData方法,開始獲取實時運動數據。

  2. 通過請求參數HiSportDataCallback對象,返回查詢結果,結果中數據類型參考實時運動 Bundle 對象鍵值

示例代碼:

HiHealthDataStore.registerSportData(context, new HiSportDataCallback() {    

    @Override    
    public void onResult(int resultCode) {
        // 接口調用結果 
        Log.i(TAG, "registerSportData onResult resultCode:" + resultCode);   
    }
    @Override    
    public void onDataChanged(int state, Bundle bundle) {
        // 實時數據變化回調        
        Log.i(TAG, "registerSportData onChange state: " + state);        
        StringBuffer stringBuffer = new StringBuffer("");              
        if (state == HiHealthKitConstant.SPORT_STATUS_RUNNING) {
            Log.i(TAG, "heart rate : " + bundle.getInt(HiHealthKitConstant.BUNDLE_KEY_HEARTRATE));
            Log.i(TAG, "distance : " + bundle.getInt(HiHealthKitConstant.BUNDLE_KEY_DISTANCE));
            Log.i(TAG, "duration : " + bundle.getInt(HiHealthKitConstant.BUNDLE_KEY_DURATION));
            Log.i(TAG, "calorie : " + bundle.getInt(HiHealthKitConstant.BUNDLE_KEY_CALORIE));
            Log.i(TAG, "totalSteps : " + bundle.getInt(HiHealthKitConstant.BUNDLE_KEY_TOTAL_STEPS));
            Log.i(TAG, "totalCreep : " + bundle.getInt(HiHealthKitConstant.BUNDLE_KEY_TOTAL_CREEP));
            Log.i(TAG, "totalDescent : " + bundle.getInt(HiHealthKitConstant.BUNDLE_KEY_TOTAL_DESCENT));
        }    
    }
});

2. 停止獲取實時運動數據

  1. 調用HiHealthDataStore對象的unregisterSportData方法,停止獲取實時運動數據。

  2. 通過請求參數HiSportDataCallback對象,返回查詢結果。

示例代碼:

HiHealthDataStore.unregisterSportData(context, new HiSportDataCallback() {    
    JSONObject jsonResult
    @Override    
    public void onResult(int resultCode) {
        // 接口調用結果
        Log.i(TAG, "unregisterSportData onResult resultCode:" + resultCode);   
    }
    @Override    
    public void onDataChanged(int state, Bundle bundle) {
        // 此時不會被調用     
    }
});

3. 根據運動類型開始運動

  1. 調用HiHealthDataStore對象的startSport方法,啟動相應類型的運動。

  2. 通過請求參數ResultCallback對象,返回查詢結果。

示例代碼:

// 室外跑步
int sportType = HiHealthKitConstant.SPORT_TYPE_RUN;
HiHealthDataStore.startSport(context, sportType, new ResultCallback() {
    @Override
    public void onResult(int resultCode, Object message) {
        if (resultCode == HiHealthError.SUCCESS) {
            Log.i(TAG, "start sport success");
        }
    }
});
  1. 對於器械運動(例如跑步機運動、划船機運動、橢圓機運動、動感單車運動),需要區分有無配對設備的場景,例如用戶想開啟划船機運動:

此時運動健康App已配對一台划船機,那麼默認連接該配對設備,然後開啟後台運動。

此時運動健康App配對不止一台划船機,那麼會彈框選擇設備,點擊開始運動後返回到應用頁面,然後開啟後台運動。

此時運動健康App沒有配對划船機設備,那麼會跳轉到運動健康App一鍵掃描頁面配對划船機設備,如下圖所示,配對成功後會返回到應用頁面,然後開啟後台運動。

4. 根據設備信息開始運動

  1. 調用HiHealthDataStore對象的startSportEx方法,傳入相應啟動參數StartSportParam,可通過設置參數CharacteristicConstant.SportModeType控制前台還是後台啟動運動。

  2. 通過請求參數ResultCallback對象,返回開啟運動狀態的結果。

示例代碼:

// 划船機為例
// Mac地址,連接符為":",例:"11:22:33:44:55:66"
String macAddress = "11:22:33:44:55:66" ;
// 是否支持FTMP,0 不支持,1 支持
int isSupportedFtmp = CharacteristicConstant.FtmpType.FTMP_SUPPORTED.getFtmpTypeValue();
// 設備類型,划船機
int deviceType = CharacteristicConstant.DeviceType.TYPE_ROWER_INDEX.getDeviceTypeValue();
// 運動類型,划船機
int sportType = CharacteristicConstant.EnhanceSportType.SPORT_TYPE_ROW_MACHINE.getEnhanceSportTypeValue();
// 構造啟動參數,用於連接設備及控制運動
StartSportParam param = new StartSportParam(macAddress, isSupportedFtmp, deviceType, sportType);
// 啟動方式,0 前台,1 後台
param.putInt(HiHealthDataKey.IS_BACKGROUND,
    CharacteristicConstant.SportModeType.BACKGROUND_SPORT_MODE.getType());
HiHealthDataStore.startSportEx(mContext, param, new ResultCallback() {
    @Override
    public void onResult(int resultCode, Object message) {
        
        if (resultCode == HiHealthError.SUCCESS) {
            Log.i(TAG, "start sportEx success");
        }
    }
});

5. 結束運動

  1. 調用HiHealthDataStore對象的stopSport方法,停止相應類型的運動(前台開啟的運動無法通過stopSport方法停止)。

  2. 通過請求參數ResultCallback對象,返回查詢結果。

示例代碼:

HiHealthDataStore.stopSport(context, new ResultCallback() {
    @Override
    public void onResult(int resultCode, Object message) {
        if (resultCode == HiHealthError.SUCCESS) {
            Log.i(TAG, "stop sport success");
        }
    }
});

了解更多詳情>>

訪問華為開發者聯盟官網
獲取開發指導文檔
華為移動服務開源倉庫地址:GitHubGitee

關注我們,第一時間了解 HMS Core 最新技術資訊~