【ITニュース解説】Building a Real-Time Heart Rate Monitoring App with Kotlin + Google Cloud
2025年09月17日に「Dev.to」が公開したITニュース「Building a Real-Time Heart Rate Monitoring App with Kotlin + Google Cloud」について初心者にもわかりやすく解説しています。
ITニュース概要
スマートフォンで心拍数をリアルタイム監視するアプリをKotlinとGoogle Cloudで開発した。ウェアラブル不要で、スマホのカメラやセンサーから心拍数を計測し、異常を通知、データをクラウドに安全に保存し、レポート表示も可能にした。
ITニュース解説
この記事で紹介されているプロジェクトは、スマートフォンだけでリアルタイムに心拍数を測定し、そのデータを安全にクラウドに保存して分析するアプリケーションを構築したものである。システムエンジニアを目指す皆さんにとって、現代のアプリ開発でどのように様々な技術が連携し、具体的な課題を解決しているかを理解する良い機会となるだろう。
近年、健康管理アプリは非常に普及しているが、多くは高価な専用ウェアラブルデバイスに依存している。このプロジェクトは、「高価なウェアラブルデバイスがなくても、スマートフォンだけで心拍数データを正確に取得し、処理し、安全に保存することは可能なのか?」という問題提起から始まった。その答えとして、信頼性とセキュリティを両立させた心拍数モニタリングアプリが開発された。
このアプリはいくつかの重要な機能を提供している。まず、スマートフォンのカメラやセンサーを利用してリアルタイムで心拍数を測定し、表示できる。次に、測定された心拍数が異常な値(例えば、特定の閾値を超える)を示した場合、ユーザーにアラートを通知する機能がある。さらに、測定データはクラウドサービスであるGoogle Cloud Firestoreに同期され、安全に保管されるため、ユーザーはいつでも自分の心拍数の履歴やトレンドを視覚的に確認できるレポートを見ることができる。また、ユーザーが安心してアプリを利用できるように、Firebase Authenticationを使った安全なユーザー認証機能も備わっている。
このアプリの構築には、現代のモバイルアプリ開発でよく使われる様々な技術が組み合わされている。ユーザーが直接操作するアプリの画面(フロントエンド)は、Googleが推奨するAndroid開発言語であるKotlinと、モダンなUI(ユーザーインターフェース)フレームワークであるJetpack Composeで作られている。データの流れを整理するMVVM(Model-View-ViewModel)アーキテクチャや、非同期処理を効率的に行うためのコルーチン(Coroutines)といった技術も使われている。 アプリの裏側で動くサーバーサイド(バックエンド)では、軽量なPython Flaskマイクロサービスが利用されており、心拍数データの分析やアラート生成といった処理を担当している。データの保存場所としては、Google CloudのNoSQLデータベースであるFirestoreが選ばれている。Firestoreは、リアルタイムでのデータ同期に強く、拡張性も高い。ユーザー認証はGoogleが提供するFirebase Authenticationサービスによって実現され、複雑な認証システムを自前で開発する手間を省いている。開発プロセスを効率化するためには、GitHub ActionsがCI/CD(継続的インテグレーション・継続的デリバリー)ツールとして活用され、コードのテストやデプロイが自動化されている。
アプリの具体的な動作の流れを見てみよう。まず、ユーザーはFirebase Authenticationを通じて安全にアプリにサインインする。次に、アプリがスマートフォンのカメラやセンサーを使ってユーザーの心拍数を測定する。測定された心拍数データは、直ちにGoogle Cloud Firestoreに送信され、クラウド上に記録される。Firestoreに保存されたデータは、Pythonで書かれたバックエンドのサービスによって定期的にチェックされ、もし心拍数が事前に設定された異常値の閾値を超えていた場合、アラートが生成される。ユーザーはアプリ内で、自分の心拍数の履歴やトレンドを示すレポートやグラフをいつでも確認できる。
ここで、実際のコード例をいくつか見て、どのように技術が使われているかを理解しよう。
Kotlinを使ってFirestoreに心拍数データを保存する部分は、非常にシンプルだ。まず、FirebaseFirestore.getInstance()というコードでFirestoreデータベースのインスタンス、つまり操作するための窓口を取得する。次に、hashMapOfという機能を使って、ユーザーID、心拍数、ステータス、タイムスタンプといった情報をひとまとめにしたデータを作成する。このデータは辞書のような形式で、各情報にはキー(データの種類を表す名前)と値(実際のデータ)がペアになっている。最後に、db.collection("HeartRateReading").add(heartRateData)というコードで、作成したデータを「HeartRateReading」という名前のコレクション(データベースにおけるデータのグループのようなもの)に追加する。データが正常に保存されればaddOnSuccessListenerが、失敗すればaddOnFailureListenerが実行され、その結果がログに出力される仕組みになっている。
Jetpack Composeを使って心拍数のトレンドを表示するUIのコードも見てみよう。@Composableというアノテーションが付いた関数は、Androidアプリの画面を構成する部品(UIコンポーネント)を定義するために使われる。ここではHeartRateCardという関数が定義されており、平均、最大、最小の心拍数を引数として受け取る。この関数の中では、Columnという縦方向に要素を並べるレイアウト部品の中に、Textというテキスト表示部品を使って、それぞれの心拍数データを表示している。例えば、「Avg: $avg BPM」のように変数avgの値が直接表示され、見やすいように太字や色分けが適用されている。このように、Jetpack Composeでは宣言的にUIを構築できるため、直感的でコードも簡潔になる。
Pythonで書かれた簡単なアラートサービスも見てみよう。このサービスは、google.cloud.firestoreライブラリを使ってFirestoreデータベースに接続する。db = firestore.Client()でデータベースクライアントを作成した後、check_alerts()という関数の中で、db.collection("HeartRateReading").stream()を使って「HeartRateReading」コレクションに保存されているすべての心拍数データを取得する。stream()は、データベースからデータを一つずつ読み込むための効率的な方法だ。取得した各データ(doc)をループで処理し、doc.to_dict()で辞書形式に変換する。もしdata["heartRate"]、つまり心拍数の値が140より大きい場合、「高心拍数が検出されました」というアラートメッセージと、該当する心拍数、ユーザーIDがコンソールに出力されるようになっている。これは、リアルタイムでデータの異常を検知する簡単な例だ。
このプロジェクトを通じて、いくつかの重要な教訓が得られた。一つは、データをデバイス内で処理するか、クラウドで処理するかの選択において、プライバシー保護とパフォーマンス(処理速度)の間にトレードオフがあることだ。ヘルスケア関連のアプリでは、個人の機密性の高い情報を取り扱うため、データセキュリティは最優先事項であり、これを確保することの重要性が再認識された。また、アプリのUI(ユーザーインターフェース)やUX(ユーザー体験)が清潔で使いやすいデザインであることは、ユーザーがアプリを積極的に利用するために不可欠であることも明らかになった。クラウドのシステムとアプリを連携させることで、リアルタイムでのデータ分析やダッシュボードの表示が可能になり、より迅速で深い洞察が得られることも重要な学びだった。
今後の展望としては、収集した心拍数データに対して機械学習モデルを適用し、単なる閾値による検知ではなく、より高度な異常検知を行うことが考えられている。また、心拍数だけでなく、血中酸素飽和度(SpO2)や血圧といった他のバイタルサインにも対応範囲を広げる計画がある。さらに、AndroidだけでなくiOSデバイスでもこのアプリを使えるようにするため、Kotlin Multiplatformという技術を使ってiOSクライアントを構築する可能性も視野に入っている。将来的には、病院や医療機関(例えばイギリスのNHSのような)とのシステム連携も目指している。
このプロジェクトは、AI(人工知能)、モバイル技術、そしてクラウド技術を組み合わせることで、人々の健康状態に関して有意義な洞察を提供できることを具体的に示した。システムエンジニアを目指す皆さんにとって、これらの要素技術がどのように連携し、実世界の問題を解決するために活用されているかを理解することは、今後のキャリアにおいて非常に役立つはずだ。