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

2022-09-09 12:02:44

酷暑終於過去,很多人伴著涼爽的秋風開啟了新一輪的健身計劃。當用戶進行戶外運動或使用跑步機、橢圓機等器械時,他們會希望在運動健康類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 最新技術資訊~