Y's note

Web技術・プロダクトマネジメント・そして経営について

本ブログの更新を停止しており、今後は下記Noteに記載していきます。
https://note.com/yutakikuchi/

Google Fit Platformについて調べてみた

Google Fitについて

f:id:yutakikuchi:20211104125935p:plain:w500

@yutakikuchi_です。 今日はGoogle Fit Platformを利用してできることを調べてみました。Google Fitは言うまでも無くGoogleが提供するFitnessアプリで2014年から公開されています。また2021.11.04現在、Google Fitをスマートフォンのアプリとしてインストールすることで、アクティビティとしての毎日の目標、歩数計測、ハートポイント(強めの運動)、消費エネルギーなど、管理することができます。2021.11月において、Androidの一部の端末(Pixel)では、スマートフォンのカメラ機能で、呼吸数や心拍数の確認をすることができます。ちなみに、僕はGoogle Pixel 4aの保有者であり、購入時からGoogle Fitはプリインされていたと思います。

また、最近ではNianticが出した新しいARゲームのPikmin BloomでもGoogle Fitのinstallが必要であり、Google Fitがもしかしたら更に注目を集めるかもしれないですね。ちなみに、Pikmin Bloomは歩くことを重視したゲームのようです。

https://play.google.com/store/apps/details?id=com.nianticlabs.pikmin&hl=ja&gl=US topics.nintendo.co.jp

Google Fitは様々なアプリと連携することができるので、Google Fitに無いデータを他のアプリで取得して、それをGoogle Fit側で管理することもできたり。またその逆もできます。Google Fitが公式として連携しているアプリは下記のURLに記載されています。

f:id:yutakikuchi:20211104120453p:plain:w500

引用 : https://play.google.com/store/apps/collection/promotion_3000e6f_googlefit_all

Google Fitのアプリでは取れないデータ、例えば日々の体重など、OMRONの体重計から取得、それをHealth syncアプリを経由してGoogle Fit側で一元管理するなど、複数のアプリを使い回すとそれぞれのアプリで取ったデータが一元管理できます。もちろん睡眠時間などのデータも他のアプリと連携することで取得可能です。下記のHealth syncはGoogle Fitの公式で連携アプリとして掲載されています。

Health Sync - Apps on Google Play

Google Fit Platformについて

f:id:yutakikuchi:20211104124846p:plain:w500

引用 : https://developers.google.com/fit/overview

Google Fit PlatformはGoogle Fitの裏側の仕組みと一言でいると思いますが、下記の4つの機能で成り立っています。主に開発者やサービス提供者がデータをGoogle Fit Platformに登録したり、データを呼び出したアプリケーションを作るための機構とも言えると思います。

  • 様々なデバイスやセンサーから取れる個人のFitness関係のデータを管理するStore
  • Fitness storeと簡単に連携するセンサーフレームワークを提供。下記のAPIと一緒に活用
  • データへのアクセスの認証認可の仕組み
  • AndroidSDKAPI、更にはWebのRestAPIの提供

Google Fit PlatformのAPIを使ってみる

https://developers.google.com/fit/rest/v1/get-started

こちらのGet startedに掲載されている手順で自身のGoogle Fitness Storeに登録されているデータを引っ張ってくる手順を記載します。手順の OAuth 2.0 Playground の項目を実施します。PlaygroundはOAuth認証が必要なAPIを簡単にお試しできるツールです。尚、僕は上でも書きましたがGoogle pixel 4aにGoogle Fitをインストールして、自身のGmailアカウントと連携をしているというのが実行の前提になります。またAPIのReference一覧は下記のURLに存在します。

https://developers.google.com/fit/rest/v1/reference

  • Step 1 : Select & authorize APIs
    • authorization コードの取得
  • Step 2 : Exchange authorization code for tokens
    • authorization コードからtokenへの変換
  • Step 3 : Configure request to API
    • APIのEndpointの設定など まずは下記のURLにアクセスし、上記Step1としてFitness V1の APIを選択し、Authorize APIsのボタンを押下します。ここではFitness V1 APIの中でも https://www.googleapis.com/auth/fitness.activity.read を指定しています。

OAuth 2.0 Playground

f:id:yutakikuchi:20211104140423p:plain:w500

上を実行すると、Authorizeボタンの後にGoogleアカウントにGoogle Playgroundからのアクセスを求められるので、Continue/許可します。許可後にStep2として取得したauthorization コードから Refresh token とAccess tokenの2つを取得します。Step3の画面でAPIのEndpointを入力すると、その際に取得したAccess Tokenを利用しながら、HTTP GETで次のURLにRequestを送るように設定します。 Google FitのAPIとして、詳細のデータを取得する際はDatasourceの中にあるDatasetへのアクセスが必要なので、Datasetの取得には2段階のAPI実行が必要となります。

  • Datasource一覧の取得
    • https://www.googleapis.com/fitness/v1/users/me/dataSources
  • Dataset一覧の取得
    • https://www.googleapis.com/fitness/v1/users/userId/dataSources/dataSourceId/datasets/datasetId

Step3を実行するとAPIから200OKのresponseが返ってきます。Response Bodyの中身はJsonなので、それを読み取ります。下記の dataStreamIdの値が実際のDatasetへのアクセスのURIになるので、取得して次のAPIにRequestを送ります。

    {
      "dataQualityStandard": [], 
      "dataType": {
        "field": [
          {
            "name": "steps", 
            "format": "integer"
          }
        ], 
        "name": "com.google.step_count.delta"
      }, 
      "dataStreamName": "estimated_steps", 
      "application": {
        "packageName": "com.google.android.gms"
      }, 
      "dataStreamId": "derived:com.google.step_count.delta:com.google.android.gms:estimated_steps", 
      "type": "derived"
    },

上で取得したdataStreamIdを基に、実際のDatasetにアクセスをします。DatasetのEndpointの末尾に datasetIdとありますが、取得範囲を時間として示すstartTimeとendTimeをnanosecondsとして連結したstringのようです。datasetIdというパラメータの名前からは想像できない、ちょっと分かりづらいですね。ここでは 1635735600000000000-1635908400000000000 として指定します。

Dataset identifier that is a composite of the minimum data point start time and maximum data point end time represented as nanoseconds from the epoch. The ID is formatted like: "startTime-endTime" where startTime and endTime are 64 bit integers.

https://www.googleapis.com/fitness/v1/users/me/dataSources/derived:com.google.step_count.delta:com.google.android.gms:estimated_steps/datasets/1635735600000000000-1635908400000000000

Google playgroundのStep3のURLを上記ものに変えて実行します。※末尾のdatasetIdは自身での書き換えが必要になりますので、ご注意ください。上のRequestはstep_count.deltaを取得するものになるので、これで特定nanoseconds間の歩数を配列形式で受け取ることができます。ちなみにstep_count.deltaの説明は下記にあります。

https://developers.google.com/fit/datatypes/activity#step_count_delta

{
  "minStartTimeNs": "1635735600000000000", 
  "maxEndTimeNs": "1635908400000000000", 
  "dataSourceId": "derived:com.google.step_count.delta:com.google.android.gms:estimated_steps", 
  "point": [
    {
      "modifiedTimeMillis": "1635738581776", 
      "startTimeNanos": "1635735582759950932", 
      "endTimeNanos": "1635735642759950932", 
      "value": [
        {
          "mapVal": [], 
          "intVal": 3
        }
      ], 
      "dataTypeName": "com.google.step_count.delta", 
      "originDataSourceId": "raw:com.google.step_count.cumulative:Google:Pixel 4a:xxxxx:Step Counter"
    }, 
    {
      "modifiedTimeMillis": "1635738581776", 
      "startTimeNanos": "1635738494664463688", 
      "endTimeNanos": "1635738554664463688", 
      "value": [
        {
          "mapVal": [], 
          "intVal": 4
        }
      ], 
      "dataTypeName": "com.google.step_count.delta", 
      "originDataSourceId": "raw:com.google.step_count.cumulative:Google:Pixel 4a:xxxxx:Step Counter"
    }, 

以上がGoogle Fit Platformについて調べて触ってみた内容になります。Google Fit PlatformのAPIを活用すると様々なヘルスケアアプリが作れそうですね。

参考リンクのまとめ