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

来源: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
  • 一:背景 1.講故事 在分析的眾多dump中,經常會遇到各種奇葩的問題,僅通過dump這種快照形式還是有很多問題搞不定,而通過 perfview 這種粒度又太粗,很難找到問題之所在,真的很頭疼,比如本篇的 短命線程 問題,參考圖如下: 我們在 t2 時刻抓取的dump對查看 短命線程 毫無幫助,我根 ...
  • 在日常後端Api開發中,我們跟前端的溝通中,通常需要協商好入參的數據類型,和參數是通過什麼方式存在於請求中的,是表單(form)、請求體(body)、地址欄參數(query)、還是說通過請求頭(header)。 當協商好後,我們的介面又需要怎麼去接收這些數據呢?很多小伙伴可能上手就是直接寫一個實體, ...
  • 許多情況下我們需要用到攝像頭獲取圖像,進而處理圖像,這篇博文介紹利用pyqt5、OpenCV實現用電腦上連接的攝像頭拍照並保存照片。為了使用和後續開發方便,這裡利用pyqt5設計了個相機界面,後面將介紹如何實現,要點包括界面設計、邏輯實現及完整代碼。 ...
  • 思路分析 註冊頁面需要對用戶提交的數據進行校驗,並且需要對用戶輸入錯誤的地方進行提示! 所有我們需要使用forms組件搭建註冊頁面! 平時我們書寫form是組件的時候是在views.py裡面書寫的, 但是為了接耦合,我們需要將forms組件都單獨寫在一個地方,需要用的時候導入就行! 例如,在項目文件 ...
  • 思路分析 登錄頁面,我們還是採用ajax的方式提交用戶數據 唯一需要學習的是如何製作圖片驗證碼! 具體的登錄頁面效果圖如下: 如何製作圖片驗證碼 推導步驟1:在img標簽的src屬性里放上驗證碼的請求路徑 補充1.img的src屬性: 1.圖片路徑 2.url 3.圖片的二進位數據 補充2:字體樣式 ...
  • 哈嘍,兄弟們! 最近有許多小伙伴都在吐槽打工好難。 每天都是執行許多重覆的任務 例如閱讀新聞、發郵件、查看天氣、打開書簽、清理文件夾等等, 使用自動化腳本,就無需手動一次又一次地完成這些任務, 非常方便啊有木有?! 而在某種程度上,Python 就是自動化的代名詞。 今天就來和大家一起學習一下, 用 ...
  • 作者:IT王小二 博客:https://itwxe.com 前面小二介紹過使用Typora+PicGo+LskyPro打造舒適寫作環境,那時候需要使用水印功能,但是小二在升級LskyPro2.x版本發現有很多不如人意的東西,遂棄用LskyPro使用MinIO結合代碼實現自己需要的圖床功能,也適合以後 ...
  • OpenAI Gym是一款用於研發和比較強化學習演算法的工具包,本文主要介紹Gym模擬環境的功能和工具包的使用方法,並詳細介紹其中的經典控制問題中的倒立擺(CartPole-v0/1)問題。最後針對倒立擺問題如何建立控制模型並採用爬山演算法優化進行了介紹,並給出了相應的完整python代碼示例和解釋。要... ...
  • python爬蟲瀏覽器偽裝 #導入urllib.request模塊 import urllib.request #設置請求頭 headers=("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, l ...
  • 前端代碼搭建 主要利用的是bootstrap3中js插件里的模態框版塊 <li><a href="" data-toggle="modal" data-target=".bs-example-modal-lg">修改密碼</a></li> <div class="modal fade bs-exam ...