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

来源:https://www.cnblogs.com/hmscore/archive/2022/09/09/16671977.html
-Advertisement-
Play Games

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


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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 2022-09-09 1、左連接查詢(left join) 查詢條件的一種,以左表為主根據條件查詢右表數據,如果根據條件查詢右表數據不存在null值填充。 以“students表(id,name,age,gender,is_del,height,c_id,id,name)” "classes表(id ...
  • 不說那種建表的時候 設置好主鍵格式 的 解決方案. 事後諸葛啊. 誰都會不靠譜方案1 改主鍵表結構. 費時! 主鍵已經超長了.說明 數據量相當大. 改表結構的時間成本你能等得起嗎方案2 超長表 改表名作為歷史表 ,新建新表,然後根據業務情況將歷史表數據酌情複製到新表中. (比如最近3個月的數據. 不 ...
  • 摘要:《Index Checkpoints for Instant Recovery in In-Memory Database Systems》是由華為雲資料庫創新Lab一作發表在資料庫領域頂級會議VLDB'2022的學術論文。 本文分享自華為雲社區《VLDB'22 HiEngine極致RTO論文 ...
  • 編者按: Benchmarking 作為一個衡量標尺,可從不同的維度來客觀公正公平的評價相關產品,例如:對應數據測評而言,有 TPC-C、TPC-H,TP-DS 等等。現有的這些測評 TPC-X 標準(Benchmarking)真的適合現有的 OLTP&OLAP 混合型資料庫嗎?現在對於很多 HTA ...
  • 摘要:看GaussDB for Redis強擴展、高可用、強一致、高安全,如何玩轉各大游戲場景 本文分享自華為雲社區《GaussDB為什麼成為游戲行業的心頭愛?》,作者: GaussDB 資料庫 。 在結束忙碌工作回家的地鐵上,難得閑暇的周末下午,和朋友再來一局的入睡前......游戲已經成為了當下 ...
  • MySQL8 Group By 新特性 此生此夜不長好,明月明年何處看。 一、簡介 MySQL8 新特性之 Group By 不再隱式排序。MySQL8對於group by 欄位不再隱式排序,如需要排序,必須顯式加上 order by 子句。 二、MySQL5.7 Group By 數據準備 Sel ...
  • 本篇文章主要介紹 Redo Log 和 Undo Log: 1. 利用 Redo Log 和 Undo Log 實現本地事務的原子性、持久性 2. Redo Log 的寫回策略 3. Redo Log Buffer 的刷盤時機 ...
  • DDL:數據定義語言 註意:對錶操作的時候需要進入到對應的資料庫裡面去。 創建表:CREATE TABLE [IF NOT EXISTS] 'tbl_name' ( 欄位1 修飾符, col2 欄位2 修飾符, ...) 例如:創建一張名為stu1的表,表中包含的欄位有id,name和age,id的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...