Runtime Permission とは別の特別なパーミッションたちとその扱い方

  • 26
    Like
  • 0
    Comment

特別なパーミッションとは

Android にはパーミッションと呼ばれる仕組みによって、アプリがユーザの許可無くプライベートなデータやセンサ類などにアクセスできないようになっています。Lollipop まではストアでのインストールと同時に許可を与えるフローでしたが、Marshmallow 以後は Runtime Permission という仕組みが導入され、アプリを起動してからユーザに許可を求めるフローへと変わりました。

さてこの記事では、その Runtime Permission のフローとは更に別なフローを経なければ許可ができない特別なパーミッションについてまとめます。この特別なパーミッションに対する許可を得るには、ユーザを然るべき画面へ遷移させ、システムの設定画面をつかった許可フローへナビゲートする必要があります。Runtime Permission ではダイアログが表示されましたが、こちらは別画面(システムの設定画面)でのフローです。

他のアプリに重ねて表示

英語の設定画面では"Draw over other apps"と表示されます。その名の通り、View を他のアプリに重ねて表示できるようにします(Facebook Messenger のチャットヘッドのようなもの)。パーミッションの名前はandroid.permission.SYSTEM_ALERT_WINDOWです。AndroidManifest.xml に<uses-permission>を記述して、かつandroid.settings.action.MANAGE_OVERLAY_PERMISSIONを Action とする画面でユーザが明示的に許可を与える必要があります(targetApi が 23 以後の場合)。許可があるかどうかは、Settings#canDrawOverlays(Context)で確認ができます。

システム設定の変更

英語の設定画面では"Modify system settings"と表示されます。アプリから直接デバイスの設定を変更するためのパーミッションです。android.permission.WRITE_SETTINGS<uses-permission>に記述し、android.settings.action.MANAGE_WRITE_SETTINGSを Action とする画面で許可を得る必要があります(targetApi が 23 以後の場合)。

通知へのアクセス

英語の設定画面では"Notification Access"と表示されます。ステータスバーに表示されている通知の追加や更新、削除といったイベントをトリガーにして、通知の内容を読むことができます。
システムはアプリに対して、通知へのアクセスのためのサービスへバインドしてくるので、AndroidManifest.xml では<service>android:permissionandroid.permission.BIND_NOTIFICATION_LISTENER_SERVICEを記述します。また、実行時にandroid.settings.ACTION_NOTIFICATION_LISTENER_SETTINGSを Action とする画面でユーザが明示的に許可を与える必要があります。

使用状況へのアクセス

英語の設定画面では"Usage Access"と表示されます。<uses-permission>android.permission.PACKAGE_USAGE_STATSと記述しますが、許可を得るにはandroid.settings.USAGE_ACCESS_SETTINGSを Action とする画面での許可が必要です。ただしこの Action に対応する画面がないデバイスもあるため、画面遷移の前に確認が必要です。

アクセシビリティ

アクセシビリティサービスのためのパーミッションです。通知へのアクセス同様、システムがアプリに対してサービスへのバインドを行うため、<services>andorid:permissionandroid.permission.BIND_ACCESSIBILITY_SERVICEを設定します。また実行時にandroid.settings.ACCESSIBILITY_SETTINGSを Action とする画面で許可を与えるフローを経る必要があります。ただしこの Action に対応する画面があるかどうかはデバイス依存です。

おわりに

これらのパーミッションが必要な場面はそう多くはないでしょう。しかし、これらのパーミッションの許可を要求するとき、アプリのなかでのフローをどう作るかが問題となります。基本的にはどのパーミッションでもデバイスの設定画面を開いてあげる必要があり、かつ何やら恐ろしげなダイアログを見た上で許可スイッチを ON にしなければなりません。一方で、許可があればそれだけユーザのプライバシーが読み取れてしまったり、デバイス上の体験を劇的に変えることができるというリスクがあるため致し方ない措置ではありますが、Runtime Permission とは別の特別な画面遷移を作る必要が有ることに留意しましょう。