AccessibilityService を使ってスクリーンをロックする
動機
Android端末を Pixel 4a に乗り換えました。概ね満足している中で画面ロック周りに不満が。
前の端末は指紋認証でロックのON/OFFができたんですが、Pixel 4a はロック解除しかできないんです。
電源ボタン押せば済むとは言え、頻繁にロックする派なので一日に何度も電源ボタン押すのちょっと嫌だなー、と。
Google Playにはスクリーンロック系のアプリがたくさんあるので試してみましたが、ロックから復帰するときに認証(自分の場合はパターン)の入力が必要なものが大半。指紋認証一発でロックから復帰してほしいのです。
何か方法がありそう、と思って調べたら AccessibilityService に行きつきました。
AccessibilityService とは?
AccessibilityService は日本語だと「ユーザー補助サービス」。なんらかの理由でデバイス操作が不自由なユーザーを支援するための仕組みです。
Android標準でTalkBack(スクリーンリーダー)などが提供されているほか、デベロッパーが独自のサービスを実装することも可能です。
具体的に何ができるかは以下URL参照。
割と何でもできるので便利な反面、取り扱い注意な仕組みです。
スクリーンロックの仕組み
AccessibilityService にある GLOBAL_ACTION_LOCK_SCREEN
というアクションを使うとアプリからスクリーンをロックできます。
AccessibilityService のための実装は多少面倒ですが、アクション呼び出し部分はとてもシンプル。
performGlobalAction(AccessibilityService.GLOBAL_ACTION_LOCK_SCREEN);
これだけでスクリーンロックがかかります。復帰時は指紋認証オンリーで復帰可能。望んでいた挙動になりました。
AccessibilityService 部分の実装は以下URLあたりを参考にしてみてください。定型的な実装になっているので、手数は多いですが難しくはありません。
- ユーザー補助サービスの作り方(AccesibilityService) | Android-Note
- 僕はただAndroidで自Serviceから他Activityにタッチイベントを発生させたいだけだったのに(ラノベ調 - Qiita
GLOBAL_ACTION_LOCK_SCREEN
を使ったスクリーンロックを実装しているアプリはGitHub上でもいくつか見つかります。自分は rascarlo/PowerButtonTile を参考にさせてもらいました。
ちなみに一点注意があって、このアクションは API Level 28 で追加されたものです。なので、必然的にAndroid9.0以降のみの対応です。
結果どうしたの?
AccessibilityService を組み込んだアプリを実装して個人的に使っています。
単にスクリーンロックするだけならさくっと実装できるんですが、設定周りとかちゃんと実装するのはまあまあ手間です。
また、AccessibilityService は強力過ぎて悪用されがちなのでGoogle Play上で厳しく取り締まられています。ヘンな使い方するとRejectされちゃうんですね。公開するとなるとその辺も気にしなくてはなりません。
なので公開するところまで作り込む気力は湧きませんでした……
興味がある方は前述の rascarlo/PowerButtonTile あたりを参考に実装してみてはいかがでしょうか?
Google Playでアプリ探してもいいんですけど、余計な機能が組み込まれているものが多いようです。だったら自分で作ったほうがいいんじゃない?という感じ。
関連(するかもしれない)記事
おススメ