asken テックブログ

askenエンジニアが日々どんなことに取り組み、どんな「学び」を得ているか、よもやま話も織り交ぜつつ綴っていきます。 皆さまにも一緒に学びを楽しんでいただけたら幸いです!

Flutter で Apple Health / Android Health Connect 連携

Flutter で Apple Health / Android Health Connect 連携

こんにちは、asken Androidエンジニアの高津です。

先日の「僕たちはどう Flutter で価値を届けるのか?」の記事の通り、asken では新規事業のアプリ開発に「Flutter」を採用することに決定しました。

下図は技術検証の観点を整理したものです。 技術検証の観点の一つとして「プロダクトでやりたいことにFlutterが対応できるのか」がありました。

検証項目

Google I/O Extendedで弊社伊藤がHealth Connectの紹介セッションに登壇させていただきましたが、askenではAndroid Health Connectの活用を推進しています。

私は過去にAndroid Health Connectを調べたことがあり、 FlutterでApple Health/Android Health Connect連携の動作検証を担当しました。

今回は、Apple Health/Android Health Connectへの接続とデータ取得を検証の対象としました。 今後リリースする新規事業でのアプリ開発がターゲットであるためGoogle Fitは対象外としました。

ライブラリを探そう

自前で実装を検討する前に、該当機能に対応するライブラリが公開されているか検索しました。

"health"をキーワードとしてpub.devで検索したところ、そのままの名前であるhealthライブラリが見つかりました。

READMEに以下の記載があり、まさに探していたライブラリです。

Enables reading and writing health data from/to Apple Health, Google Fit and Health Connect.

候補となるライブラリが他に見つからなかったため、このライブラリを利用できるか検証を進めました。

動作を確認しよう

READMEの記述に従い検証用プログラムを作成し、実際の動作を確認しました。

Apple Healthは問題なく歩数データを取得できましたが、Android Health Connect経由では歩数データを取得できませんでした。

そもそもAndroid Health Connectにアクセスできていないようでした。

コードを読んだ結果、Android Health Connectの利用フラグがあることを見つけ、以下のように有効化しました。

    // useHealthConnectIfAvailable がデフォルトfalseなのでtrueを設定するように変更
    HealthFactory health = HealthFactory(useHealthConnectIfAvailable: true);

その結果、Android Health Connectにアクセスするようになりました。 ただし権限周りで例外が発生してしまい、歩数データを取得できないままとなりました。

問題が解決しないので質問しよう

調査を続けたものの独力では解決できなかったのでGithubにIssueを立てました。

すると同じ問題で困っている人が見つかり、解決方法を提供してくれました。

以下のように、Android Health Connectを利用するには、マニフェストファイルにて権限リクエストするActivityにACTION_SHOW_PERMISSIONS_RATIONALEのintent-filterを設定する必要がありました。

        <activity
            android:name=".MainActivity"
            android:exported="true"
            android:launchMode="singleTop"
            android:theme="@style/LaunchTheme"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
            android:hardwareAccelerated="true"
            android:windowSoftInputMode="adjustResize">
            <meta-data
              android:name="io.flutter.embedding.android.NormalTheme"
              android:resource="@style/NormalTheme"
              />
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
                <!-- 以下のactionを追加 -->
                <action android:name="androidx.health.ACTION_SHOW_PERMISSIONS_RATIONALE" />
            </intent-filter>
        </activity>

上記を試してみたところ、Android Health Connect経由で歩数データを取得できることを確認できました!

検証結果

今回の検証で、既存のhealthライブラリを利用することによりApple Health及びAndroid Health Connect連携機能はFlutterでも容易に実装可能であることが実際に確認できました。

おまけ

Issueを眺めていたら同様に困っている人がいた為、自分の解決方法を共有したところ、 その内容がContributorの目に留まり、READMEを更新してくれました。 ありがとうございます。 この記事に辿り着かなくても、同じ問題にハマる人が減るのは良いですね。

積極採用中です!

askenではエンジニアを募集しています。 よろしくお願いします。

www.asken.inc