はじめに
この記事は ESM Advent Calendar 2025 の19日目の記事です。
こんにちは。
少し前のお話にはなりますが、2024年4月、スマホの着信をライトの光で知らせるアプリ「いろどり+(いろどりたす)」を公開しました。
今回は、なぜこのアプリを作ったのかという開発の経緯から、その機能や技術的な裏側、開発中にぶつかった壁まで、アプリ公開に至るまでのあれこれをご紹介します。
なぜアプリを開発することになったのか
今、全国的にひとり暮らしの高齢者が増えています。
みなさんは、ご自身の親御さんや周りの方で、こんな経験をしたことはありませんか?
何度かけても電話に出ない…まさか倒れてるんじゃ!?(急いで実家へ!)
(ガラッ!)お父さん大丈夫!?
(テレビを見ながら)ん? 急に来てどうした?
何度電話しても出ないんだもの、倒れてるかと思ったじゃない!!
電話? まったく気づかんかったわ
元気なのはよかったけど…もうっ!勘弁してよ〜
これ、実は「あるある」なお話なんです。
高齢になると高音の電子音が聞き取りづらくなる1ため、どうしても電話や通知に気づきにくくなってしまうようです。
そこで私たちは考えました。
「耳(聴覚)」が難しいなら、「目(視覚)」で知らせればいいじゃないか。
また、今は80代でも3人に2人がスマホを持っている時代2です。
「スマホの着信を検知して、部屋のライトが明るくピカっと光る」
そんな仕組みがあったら、きっとこの心配ごとは解決できるはず。
そして開発したのが、スマホアプリ「いろどり+」です。
「いろどり+」ができること
必要なもの
- Androidスマホ
- OS:Android 10 以上
- 通信:Bluetooth 4.2 以上 / BLE (Bluetooth Low Energy) 対応
- 専用のライト
高齢者のお宅は、Wi-Fi環境のないお宅が多いです。そのため、このアプリでは、Androidスマホとスマート電球を Bluetooth (BLE) で直接接続して使用します。Wi-Fiは不要です。
主な機能
| 機能 | 内容 |
|---|---|
|
|
電話やSMSが来るとライトが光る |
|
|
スマホの電池が減るとライトが光る |
|
|
指定した時間になるとライトが光る |
↓ 挙動はこちらの動画をご覧ください
どのように実現しているのか
「これ、どうやって動いてるんですか?」とご質問をいただくことがあります。
ここでは、よくあるご質問をQ/A形式でお答えします。
専用のライトとしてSwitchBotスマート電球を選んだ理由は?
「APIが公開されている」「Bluetooth直接接続」「入手性」です。
そもそもの前提として、専用のライトには、アプリから制御するためにIoT連携が可能なデバイスを用意する必要がありました。そのため、以下の理由により、SwitchBotスマート電球の採用を決めました。
- API仕様が公開されている
- 多種多様なスマート電球の中でAPI仕様が公開されている製品は数えるほどしかありませんが、SwitchBotスマート電球には仕様が公開されているAPIがありました
- SwitchBot社に使用許諾を確認した上で利用しています
- 多種多様なスマート電球の中でAPI仕様が公開されている製品は数えるほどしかありませんが、SwitchBotスマート電球には仕様が公開されているAPIがありました
- Bluetooth直接接続
- 多くの製品はWi-Fiや専用ハブが必須ですが、SwitchBot電球はBluetoothだけでスマホと通信ができるため、Wi-Fi環境がない高齢者宅でも利用が可能でした
- 入手のしやすさ
- Amazonや楽天市場などの大手ECサイトでも一般の方向けに販売されている製品なので、誰でも手軽に購入することができます
電話・SMSの着信はどうやって検知するの?
スマホ標準の電話機能・SMS受信機能をアプリが監視!ブロードキャストでイベントをフックしています。
スマホにかかってきた電話やSMSそのもの(Androidの電話機能・SMS受信機能)をアプリが監視しています。そのため、連絡する側(家族)は「いろどり+」をインストールする必要はなく、いつも通り電話をかけたりメッセージを送るだけでOKです。
〔もう少し詳しく〕
監視には、ブロードキャスト(Broadcast)という仕組みを利用しています。BroadcastReceiver を実装し、Android OSから発せられる PHONE_STATE (電話の状態)や SMS_RECEIVED (SMS受信)といったイベントをフックします。
これにより、アプリがバックグラウンドにあってもOSからの通知を受け取り、即座にライトへ点灯命令を出すことができます。
IP電話、LINE、Gmail、+メッセージ (RCS)、Googleメッセージ (RCS) などの着信・受信には対応していません。外部から着信・受信イベントを取得するためのAPIが公開されていないためです。アプリからの通知の内容を解析し、無理やり光らせることも可能ですが、アプリごとの通知設定(ON/OFF)に動作が左右されること、各アプリの規約やOSのセキュリティポリシー的にリスクがあることから、実装を見送っています。
どんな人からの着信でも光ってしまうの?
スマホの電話帳への登録有無をチェックし、電話番号をフィルタリングすることが可能です。
「知らない番号からの電話が怖い」という声に応え、電話帳に登録されている人からの連絡だけ光らせるというオプションを用意しています。
〔もう少し詳しく〕
アプリ内に独自の電話帳データベースを持つのではなく、Android標準の電話帳 Contacts Provider を直接参照しています。着信時に電話帳をチェックし、登録されている番号かどうかのフィルタリング処理を行っています。アプリ側で改めて連絡先を登録する必要がなく、データの二重管理が発生しません。
充電切れ防止の仕組みは?ライトはいつ光るの?
スマホの電源状態の変化を監視し、「電池残量20%以下」を検知したらライトを光らせます。
連絡が取れない原因としてよく耳にするのが「気づいたらスマホの電池が切れていた」です。これを防ぐため、スマホが「電池残量が20%以下」になったことを検知するとライトを光らせて充電を促します。
〔もう少し詳しく〕
Androidの ACTION_BATTERY_CHANGED インテントを利用してスマホの電源状態の変化を監視します。
Android OSから送られてくるブロードキャストを受け取り、「電池残量が20%以下」であること、かつ、「充電中ではない」状態を判定した瞬間に、ライトを点灯させるコマンドを送信します。
充電が開始されて、「充電中」の状態に変化したことを検知すれば、即座に消灯コマンドを送ります。
外出先から帰宅した時、ライトへの接続はどうなる?
通信が回復したことを検知し、何もしなくても自動的に再接続されます。
スマホを持って外出すると、家のライトとのBluetooth接続は当然切れます。しかし、帰宅後、スマホが再び圏内に入ってBluetoothの通信が可能になれば、アプリはライトの制御を自動的に再開します。利用者はわざわざ自分でアプリを立ち上げたりする必要はありません。
また、もし外出中に不在着信などがあった場合は、つながった瞬間にライトを光らせてお知らせします。
〔もう少し詳しく〕
帰宅後に、Blluetoothの接続状態が変化すると、Android OSからは、BluetoothGattCallback.onConnectionStateChange() のコールバックで STATE_CONNECTED が通知されます。これを受け、アプリはライトのセットアップ(サービスのディスカバーなど)を行い、制御可能な状態へ復帰させます 。なお、ここでは、前回接続時に取得したしたライトのMACアドレスが利用可能であるため、スキャンまでは行いません。
ぶつかった壁
いざ開発を始めると、いくつもの高い壁が立ちはだかりました。
ここでは、苦労したポイントや、技術的な制約により断念したことをご紹介します。
Google Play 審査(権限の壁)
このアプリは「電話の着信を知る」ために、「通話履歴やSMSの権限」を使います。しかし、Googleはこの権限に対して非常に厳しく、通常は「標準の電話アプリ」以外には許可を出しません。
「標準の電話アプリ」ではないため、「コネクテッド デバイスのコンパニオン アプリ」という例外カテゴリで申請しましたが、何度も審査に落ちました。
どう乗り越えたか?
ストアの掲載情報に、ライトと接続して着信などをお知らせするアプリであることをしっかりと明記しました。また、「このアプリは、スマート電球という外部機器に着信を知らせるために、どうしてもこの権限が必要なんだ!」ということを、Googleに粘り強く説明しました。
問い合わせや、異議申し立てを行うこと、数回。
私たちの想いを汲み取っていただけたのか、ついに審査を通過することができました。
アプリが勝手に終了させられる(Android OSの壁)
このアプリは、いつ来るかわからない着信に備えるため、「24時間365日」動き続ける必要があります。そのため、フォアグラウンドサービスとして実行し、常に動作するようにしています。
しかしながら、こんな場合も継続して動作させなければなりません。
- アプリをキルした
- スマホの電源を再起動した
- 他のアプリを大量に開いてメモリが不足してアプリが落ちた
- スマホを何日も放置してアプリが落ちた
自身で操作してアプリを落としたときはもちろんのこと、Android OSが勝手にアプリを強制終了してきたときにも対応する必要がありました。
なお、様々な機種で実験したところ、3日ほど触らないとOSから強制終了されてしまいました。高齢者の方だと、スマホを3日使わない状況は普通にあり得るため、対応は必須でした。
どう乗り越えたか?
前提として、フォアグラウンドサービスとしてサービスを起動する際に START_STICKY を指定することで、どんなにアプリが落とされても、自動的に再起動するよう実装しました。
また、それに加えて、動作を不安定にさせる可能性のある各種設定に対応するため、アプリのインストール時に適切な設定を促すとともに、FAQや利用手引きの充実を図りました。
- バッテリー制限の設定
- アプリにバッテリー制限がかかっていると、消費電力を抑えるために、OSがアプリを制限しようとします。そのため、下記の設定が「最適化」や「制限中」ではなく、「制限なし」に設定されていることの確認をお願いしています。
スマホ本体の設定 > アプリ > いろどり+ > アプリのバッテリー使用量
- アプリにバッテリー制限がかかっていると、消費電力を抑えるために、OSがアプリを制限しようとします。そのため、下記の設定が「最適化」や「制限中」ではなく、「制限なし」に設定されていることの確認をお願いしています。
- バックグラウンドでの常時実行を許可する設定
- 機種によっては、バックグラウンドでの常時実行を許可する設定があります。アプリがバックグラウンドでも常に動作することを可能にするため、この設定をONにする必要があります。
スマホ本体の設定 > アプリ > いろどり+ > バッテリー使用量 > バックグラウンドでの使用を許可-
スマホ本体の設定 > アプリ > いろどり+ > バッテリー使用量 > バックグラウンドアクティビティを許可(※OPPO製の一部機種など)
- 機種によっては、バックグラウンドでの常時実行を許可する設定があります。アプリがバックグラウンドでも常に動作することを可能にするため、この設定をONにする必要があります。
- バックグラウンドでの自動起動を許可する設定
- 機種によっては、アプリの自動起動を許可する設定があります。アプリが落とされたときでも自動的に再起動することを可能にするため、「いろどり+」を対象として設定する必要があります。
-
スマホ本体の設定 > アプリ > アプリを管理 > バックグラウンドでの自動起動(※Xiaomi製の一部機種など)
-
- 機種によっては、アプリの自動起動を許可する設定があります。アプリが落とされたときでも自動的に再起動することを可能にするため、「いろどり+」を対象として設定する必要があります。
※ いずれの設定も、機種によって表記は異なります。
iPhone対応(iOSの壁)
これがこのアプリ一番の難関でした。
- 着信を常時監視する
- Androidの「フォアグラウンドサービス」のように、アプリを裏側で常駐させて着信イベントを待ち受けることが、iOSでは非常に困難です
- 通常のアプリ実装では許可されず、実現には電話アプリとしての実装(CallKitなど)が必要になります
- 帰宅時に自動でライトに再接続する
- アプリがキルされている状態で「ライトのBluetooth圏内に入った」ことをOSが検知し、自動でアプリを起こして接続する...という挙動が、標準のCore Bluetoothでは実現できません
- iBeaconを組み込んだ自前デバイスを作れば可能かもしれません...が、入手しやすい市販の製品を使うというコンセプトからは外れますし、そもそも、デバイス製造からはじめるのは正直難しいです
iOSの強力なセキュリティとバックグラウンド制限により、核となる機能の実現が非常に困難です。
どう乗り越えたか?
……乗り越えられませんでした
!
ですので、「いろどり+」は、現在、Android専用のアプリとして提供しています。
iPhoneに対応する良いアイデアがあれば、ぜひ教えてください。
おわりに
離れて暮らす親と連絡が取れないという心配ごとを解決したい。
そんな思いで開発したこのアプリが、どこかのご家族の安心につながれば嬉しいです。
最後までお読みいただきありがとうございました!
★ Special Thanks !! ソフトランスさん
-
参考:「難聴について」(日本耳鼻咽喉科頭顎部科学会)(https://www.jibika.or.jp/owned/hwel/hearingloss/) ↩
-
参考:「2025年シニア調査」(モバイル社会研究所)(https://www.moba-ken.jp/project/seniors/seniors20250324.html) ↩
