はじめに
突然ですが皆さん、知らない電話番号から電話がかかってきたらどうしますか?
私は(手元にPCとかがある時は)とりあえず電話番号をgoogleで検索するようにしています。例えば投資の勧誘とかは大体共有されていて検索結果に出るので、出る前にある程度の心構えもできるのですが、検索する時いつも思っていることがありました。
電話番号手打ちするのめんどくさい
着信画面を見て番号を目コピするという作業は地味に面倒なことです。当然重要な連絡であった場合、あんまりこの作業に時間をかけて相手を待たせるわけにもいきません。
そこで、電話を受ける→電話番号を検索する、を省力化するためのアプリを作りました。
方針
ここからは方針について試行錯誤の過程をダイジェストでお送りします。
大体の実装はcopilot任せだからこれくらいしか書くことがない
- 最も単純な方法として、着信時のイベントリスナーを実装して番号を取得
- 実装はシンプルに済みそう
- 着信時のイベントはそんな頻繁に呼ばれるものでもないのでパフォーマンスの問題も気にしなくてよさそう
-
毎回着信させないといけないのでデバッグがしづらい
- とにかくこの点が気になるので先に他の方法を検討
- スクリーンショットを起点に電話番号を取得するのはどうか?
- スクリーンショット撮影時のイベントリスナーから電話番号を識別する
- 必ずしも着信でなくていいのでデバッグがしやすい
- ユーザの操作量は増える
- 起動したいときだけ起動できるということでもある
- OCR的な文字認識を介する必要あり
- そこまで致命的なことではないが、誤検出の可能性もある
- 今回は一旦考えないことに
- そこまで致命的なことではないが、誤検出の可能性もある
- パフォーマンスの問題
- スクリーンショット撮影の監視はコストが大きいらしい
- ContentObserver(ファイルシステムの変更を監視するクラス)を使う
- スクショ以外でも発火機会が多い
- ファイルアクセスが必要
- 毎回スクリーンショットの判定が必要
- ContentObserver(ファイルシステムの変更を監視するクラス)を使う
- スクリーンショット撮影の監視はコストが大きいらしい
- デバッグのしやすさは魅力だが課題が多いので一旦諦め
- スクリーンショット撮影時のイベントリスナーから電話番号を識別する
- そもそも自動発火するイベントの監視に拘る必要はない
- ユーザが明示的に起動する何かのイベントに紐づけられればそれでいい
- 着信が来る→ユーザが何かをする→電話番号識別に成功という流れができればOK
- TileServiceを使ってみる
- クイック設定パネル(画面を上から下にスライドすると出てくる奴)にアプリを登録できる機能
- 着信画面のキャプチャから電話番号認識までの一連の処理を実装し、パネルから起動する
- Androidではセキュリティ上の問題から画面キャプチャには逐次許可が必要らしいことが分かる
- 許可をいじっている間に本来キャプチャしたいウインドウが裏にいってしまうという問題が出る
- 時間差でキャプチャするという手もあるが遠回りになってきたのでこの方針は一旦白紙にする
- クイック設定パネル(画面を上から下にスライドすると出てくる奴)にアプリを登録できる機能
- スクリーンショットまでは手動で取るとして、その後何らかの操作で取得内容を電話番号認識に回したい
-
共有機能を使えばいいのでは? ということに気づく
- 着信画面のスクリーンショット撮影後、共有機能で自作アプリに送る
- 共有時にアプリが起動するので常駐によるオーバーヘッドが発生しない
- 多少操作量は増えるが標準的な機能で実装できるので操作が直感的になる
- この方針でGO!
-
共有機能を使えばいいのでは? ということに気づく
- ユーザが明示的に起動する何かのイベントに紐づけられればそれでいい
できたもの
着信画面のスクリーンショットから共有でアプリを起動することで、電話番号を識別し検索にかけます。
以上です。
