Android M Developer Preview2が先日公開されました。相変わらずソースは公開されていないので、外から見る事しかできませんが、パミッションモデルが大きく変更になるため追いかけています。

パミッションモデルの変更については、以前のブログ、Google I/O 2015 新しいパミッションモデルの超訳に詳しく記載しましたが、Preview2のリリースで超訳したページが加筆修正されてしまいました。

一通り変更が加わった点は洗い出したのですが、Preview3 Preview4とまた変更になると思うので、今回は加筆、変更が加わった部分だけ纏めて、正式リリース時に1本にまとめたいと思います。

原文へのリンク: https://developer.android.com/preview/features/runtime-permissions.html

 

Overview

Permission groups(追記)

関連するパミッションはパミッショングループに分類され、ユーザは関連するパミッションに(グループに)許可を与えます。ユーザーは各権限グループに1度だけアクセス許可を与えます。アプリが同じ権限グループの異なるパミッションを要求した時、システムはユーザの操作なしで自動的に許可を与えます。システムはユーザが操作を行った時と同じようにonRequestPermissionsResult()メソッドを呼び出します。

例えば、アプリケーションのマニュフェストファイルに、SEND_SMSとRECEIVE_SMSパミッション(どちらも、android.permission-group.SMSグループに所属している)の利用宣言がされている時で考えます。アプリケーションは、SMSを送る必要がある時、SEND_SMSパミッションを要求します。システムはユーザーにこのアプリがSMSアクセスをして良いかの許可ダイアログを出します。ユーザが許可をした時、システムはアプリケーションにSEND_SMS権限の許可を与えます。その後、アプリケーションがRECEIVE_SMSの要求を出したとき、ユーザは既に同じパミッショングループ(SMSグループ)の許可を与えているので、システムは自動的に権限を与えます。(許可を求めるシステムダイアログは表示されない)

Coding for Runtime Permissions

Table1.Permission and Permission group表

テーブルに以下のパミッションが追記された。

android.permission-group.STORAGE
  • android.permission.READ_EXTERNAL_STORAGE
  • android.permission.WRITE_EXTERNAL_STORAGE

Explain Why the app needs permissions(追記)

ある状況下では、あなたのアプリが何故パミッションを必要とするのかをユーザに理解してもらいたいと思う事があります。例えばユーザが写真アプリを起動した時、アプリケーションがカメラを使用する許可を要求しても、多分ユーザは驚かないでしょう。しかしユーザがパミッション要求を拒否した時は、そのユーザは何故そのパミッションが必要なのかの手助けが必要としている場合があり、ユーザは再びその写真アプリを起動するでしょう。

(訳注:写真アプリとカメラの機能が結びついていない状況があり得る)

このような状況を見つけて、説明を提供するために、Activity.shouldShowRequestPermissionRationale(String) メソッドが存在します。このメソッドは、以前にアプリケーションがパミッションを要求し、ユーザが拒否をした時trueを返します。この時、ユーザに何故そのパミッションが必要なのかを説明する必要があります。

ユーザが過去に、パミッションの要求を拒否し、その時「今後は許可しない」チェックを付けた場合は、このメソッドはfalseを返します。また、デバイスポリシーによりそのアプリが権限を持つことを禁止している場合はfalseを返します。

「今後は確認しないチェックボックス」

no_check

Best Practices and Usage Notes

Normal Permissions(追記)

多くのパミッションはPROTECTION_NORMALとして指定されています。これは、アプリケーションがこれらのパミッションを持っていても、ユーザのプライバシーやセキュリティ上(※1:おおきな)リスクがない事を示しています。例えばユーザはユーザはアプリが自分の電話帳情報を読むことができるかどうかを知りたいでしょう。これとは対照的に、アプリがデバイスを振動させることには大きなリスクがないので、その権限(VIBRATE権限)はNORMALに指定されています。

※1:訳者注:大きなリスクとは、あくまでもGoogleが考える「おおきなリスク」

アプリケーションがマニュフェスト上で、NORMALパミッションの利用宣言をしている時、システムはインストール時に自動的にその権限を与えます。システムはユーザのノーマルパミッションの許可を付与するようにユーザに要求する事はありません。そしてユーザはそれらのパミッションを削除する事はできません。

アプリケーションがノーマルパミッションをマニュフェストで利用宣言している時、アプリケーションはそれらのアプリのために、Activity.checkSelfPermission()やActivity.requestPermissions()を呼ぶ必要はありません。何故なら、マニュフェストに利用宣言をした時は、インストール時に権限が与えられるからです。

現在、以下のパミッションは、PROTECTION_NORMALに分類されています。

  • permission.ACCESS_LOCATION_EXTRA_COMMANDS
  • permission.ACCESS_NETWORK_STATE
  • permission.ACCESS_WIFI_STATE
  • permission.ACCESS_WIMAX_STATE
  • permission.BLUETOOTH
  • permission.BLUETOOTH_ADMIN
  • permission.BROADCAST_STICKY
  • permission.CHANGE_NETWORK_STATE
  • permission.CHANGE_WIFI_MULTICAST_STATE
  • permission.CHANGE_WIFI_STATE
  • permission.DISABLE_KEYGUARD
  • permission.EXPAND_STATUS_BAR
  • permission.FLASHLIGHT
  • permission.GET_ACCOUNTS
  • permission.GET_PACKAGE_SIZE
  • permission.INTERNET
  • permission.KILL_BACKGROUND_PROCESSES
  • permission.MODIFY_AUDIO_SETTINGS
  • permission.NFC
  • permission.PERSISTENT_ACTIVITY
  • permission.READ_SYNC_SETTINGS
  • permission.READ_SYNC_STATS
  • permission.READ_USER_DICTIONARY
  • permission.RECEIVE_BOOT_COMPLETED
  • permission.REORDER_TASKS
  • permission.SET_TIME_ZONE
  • permission.SET_WALLPAPER
  • permission.SET_WALLPAPER_HINTS
  • permission.SUBSCRIBED_FEEDS_READ
  • permission.TRANSMIT_IR
  • permission.VIBRATE
  • permission.WAKE_LOCK
  • permission.WRITE_SETTINGS
  • permission.WRITE_SYNC_SETTINGS
  • permission.WRITE_USER_DICTIONARY
  • android.alarm.permission.SET_ALARM
  • android.launcher.permission.INSTALL_SHORTCUT

 

訳注:ノーマルパミッションはユーザには見えないため、存在意義自体あまりない。今回今まで、dangerousパミッションだったものが、normalパミッションに変更になっており大丈夫か?という感じなので、わざわざ再度このような説明を加えたと類推できる。

2015/7/15追記
WRITE_SETTINGは、Preview2でnormalからdangerousに変更になっていました。Googleさんのドキュメントミスです。

また、Permissionページは、本家から翻訳ページがでました。

https://developer.android.com/intl/ja/preview/features/runtime-permissions.html

まとめ

M1からM2へのPermissionページの変更箇所は、多少文言の修正はあったが、加筆だけだと考えて問題ない。

M1の時は、WRITE_EXTERNAL_STRAGEパミッションが、dangerousからnormalに変更になって?ほんと??と思ったが、M2でnomarlからdangerousに戻ったので一安心、ただ上のnormalパミッションを見てもらうとわかるけど、この権限ユーザに許可を得なくて本当に大丈夫?という物が散在している。
このまま行くのか、今後変更になるのか….