スマホ依存を治すアプリを、未経験で作り始めたシリーズ#3 本当に開けなくした。3つの壁を越えて。

スマホ依存を治すアプリを、未経験で作り始めたシリーズ#3 本当に開けなくした。3つの壁を越えて。

記事
IT・テクノロジー
私は今、AIを使いながら、未経験からAndroidアプリを作っています。
作っているのは、スマホ依存を少しでも断ち切るためのアプリです。
普段はAIを使った制作代行をしています。
今日の記事はシリーズ3つ目、アプリをブロックする過程についての話です。


前回の記事の末尾に、こう書いた。
「次回は、指定したアプリを本当に開けなくする実装に入る。ここが一番難しいところだと、すでに聞いている。」
予告通り、難しかった。乗り越えなければならない壁が、3つあったのだ。


壁① 普通のAPIじゃ、届かなかった

「アプリが起動したことを、どうやって検知するのか」
それが最初の問いだった。
作りたいものはシンプルだ。
残り時間が0のとき、YouTubeを開こうとしたら画面を遮ればいい。
でもそのためには、「YouTubeが開かれた」という瞬間を、StepLock(私が今作っているアプリの名前)が知る必要がある。
どうすれば知れるのか。

Claudeに伝えた。「残り時間が0のとき、指定したアプリの起動をブロックしたい。どんな仕組みで作ればいいですか」。

返ってきた答えは、予想外だった。

「AccessibilityServiceを使います」

アクセシビリティ。直訳すれば「使いやすさ」。
本来は、目や耳や手に不自由がある人がスマホを操作しやすくするために、OSが特別に用意した機能だ。
画面を読み上げたり、タップを補助したりする——そのためにOSの深い層に作られた仕組みを使う必要があると、Claudeは言った。

障害者支援のために設計された機能を転用して、アプリをブロックする。

思ったより深いところに潜ることになった。
Claudeはその実装コードを書いてくれた。私はそれをファイルに反映して、次のステップへ進んだ。


壁② 鍵が2つ要った


実装を終えて、端末にアプリを載せた。
さっそくテストしてみた。
画面の残り時間をゼロにして、YouTubeのアイコンをタップする。
静かだった。YouTubeはいつも通り、何事もなく起動した。
おかしい。仕組みは入れたはずだ。それなのに何も変わっていないし、エラーも警告も出ていない。「動いていません」という報告すらない。
ただ無反応なだけだった。何が足りないのかが、わからなかった。

Claudeに状況をそのまま伝えた。「実装したのに、何も起きない。エラーも出ていない」。
返ってきた説明はこうだった。「この機能を動かすには、2つの権限が別々に必要です。どちらか一方でも欠けていると、エラーを出さずに完全に無反応になります」。

ひとつは、設定アプリの奥にある「ユーザー補助機能」という画面から、StepLockを手動でONにする権限。

もうひとつは、「他のアプリの上に画面を表示する」ための権限で、これも別の画面から手動で有効にする必要があった。
どちらもアプリ側から案内はできるが、最後にONにするのはユーザー自身だ。そしてこの2つが揃って初めて、仕組みが動き始める。

言われた手順通りに、2つの設定を有効にする。
そして、もう一度、YouTubeを開こうとした。今度はしっかり稼働した。が、想定通りではなかった。


壁③ 自分で自分をブロックした

ブロック画面が出たのだ。
ただし、開いたのはYouTubeではなかった。StepLock自身を開こうとしたとき、StepLockがブロック画面を出した。
自分が自分の入り口に立ちはだかっていた。番人が自分の家に入れなくなった状態だ。

原因を考えた。
この仕組みは「どんなアプリが起動しても」反応する。StepLock自身が開かれたときも、例外なく検知してしまう。だから自分でブロックしてしまっていた。
解決策はシンプルだった。
「StepLock自身が起動したときのイベントは無視する」という条件を一行加えるだけでいい。どのタイミングで何を無視するかを私が判断して、Claudeに伝えた。
Claudeはその一行を正しい場所に書き加えてくれた。
修正後、もう一度試した。


YouTubeがブロックされている!!

3つの壁を越えたあと、深呼吸して、もう一度テストした。
残り時間を0に設定。画面には「あと100歩で解放」という青いカードが出ている。その状態で、YouTubeのアイコンをタップした。

すると、センターにカギがおかれた黒い画面が!

「🔒 解放されていません。歩いてから使ってください。」

思わず、声が出た。

3日かけて潜り込んだ場所から、ようやく戻ってきた気がした。壁を3つ越えて、設定を2つONにして、自分で自分をブロックするという間抜けな失敗もして——そのすべての先に、たった一枚の黒い画面があった。

前回、タイマーが動いたときも嬉しかった。
でも今回の感触は少し違った。
タイマーが動くのは「仕組みが動いた」だ。
アプリが開かないのは「意志が動いた」だ。スマホを開こうとした手が、ちゃんと止まった。
作ろうとしていたものが、ここにある。


どのアプリをブロックするか、選べるようにした。

ブロックが成功したあと、もう一つ気になることがあった。

今の状態では、ブロックするアプリがコードの中に直接書き込まれている。「YouTube」という名前が、ソースコードの奥に埋まっている状態だ。

これはつまり、指定した車両を通行禁止にしたいのに、マニュアルに「プリウス通行禁止」と書かれている状態だ。

これでは使う人が自分で選べない。
私専用のアプリのままになってしまう。
「インストール済みのアプリを一覧で表示して、チェックボックスで選べる画面が欲しい。選んだ内容はアプリを閉じても消えないようにしたい」とClaudeに伝えた。

何を実現したいかを私が決めて、どう書くかをClaudeが担当する。この形は、このシリーズを通じてずっと変わっていない。

完成した画面を開くと、スマホにインストールされたアプリが一覧で並んでいた。
YouTubeにチェックを入れて保存する。
アプリを再起動しても、その設定が残っている。TikTokでもInstagramでも、自分が時間を吸われていると感じるアプリを選べばいい。
ひとつの機能を動かすたびに、少しずつ「ちゃんとしたアプリ」に近づいていく感覚がある。


次回:開いたまま、時間切れになったら

ひとつだけ、まだ塞いでいない穴がある。
YouTubeを開いた状態のまま60秒が過ぎた場合、ブロック画面が出ない。今の仕組みは「アプリが新しく開かれた瞬間」にしか反応しないからだ。すでに開いているアプリには、まだ手が届いていない。
次回は、その穴を塞ぐ。
動かすまで、終われない。
サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す ココナラコンテンツマーケット ノウハウ記事・テンプレート・デザイン素材はこちら