Android M Developer Preview3が本日公開されました。取り急ぎPermission関係の調査をしています。

前回までの解説ページ

Android M Developer Preview1
Android M Developer Preview2
Android M New-Permission-Group

さて、今回Permissionの解説ページが変更になりましたが、Supportライブラリへの解説追記が追加されたのみでした。「final APIs 」と言っているので期待したのですが、「MMC」というキーワードそのままだし<uses-permission-sdk-m>とか最終的に消えるであろうキーワードがどうなるのか?この当たり結構影響が大きい所なので、その辺りがまったく見えなくてちょっとがっかりです。
また、今回のリリースノートをみると

Translations of the documentation are available. Use the language selector at the bottom right corner of any page to switch languages. Note that some of the translated docs are not yet updated for Developer Preview 3.

と、翻訳ページ用意したぜ!とどや顔で書いてあるのですが、日本語の本家Developer Preview パーミッションのページは、Preview1の物なので注意してください。

以下今回追加説明された、Supportライブラリについてです。現状では、まだ、まだ変更が予想されるため、仕様が確定したら全て纏めて書こうと思っております

Support Librfary  methods for handling permissions

V4とV13のサポートライブラリリビジョン23には、パミッションに関する新しいメソッドが追加されています。
サポートライブラリのメソッドは、これらのサポートライブラリを使用する事ができる任意のデバイス上で正常に動作します。
サポートライブラリメソッドを使えば、アプリがMデベロッパープレビューのデバイス上で動作しているかをチェックする必要はありません。
アプリがMプレビューデバイスにインストールされた時、サポートライブラリは、そのフレームワークの動作と同様に動作します。M以前のデバイスで動作している時は、以下に示すように適切に動作をします。

サポートライブラリV4は以下のメソッドを提供します。

ContextCompat.checkSelfPermission()
Mプレビューデバイス上で動作しているしていないにかかわらず、指定したアクセス権を持っている場合は「true」を返します。
ActivityCompat.requestPermissions()
Mプレビューデバイスではない場合、ActivityCompat.OnRequestPermissionsResultCallbackでコールバックメソッドを呼び出します。
アプリが指定したパミッションを持っている場合は、PERMISSION_GRANTED、持っていない場合はPERMISSION_DENIEDを返します。

ActivityCompat.shouldShowRequestPermissionRationale()
Mプレビューデバイスで動いてない場合はfalseを返します。

V4サポートライブラリは、PermissionCheckerクラスが含まれています。PermissionCheckerクラスは、IPC(インタープロセスコミュニケーション)を使って他のアプリにサービスを提供するようなアプリのために、いくつかのスタティックユーティリティメソッドを提供します。例えばPermissionChecker.checkCallingPermission()は、指定されたパミッションを持っている特定のパッケージによって作成されたがかどうかチェックします。

NOTE:

あなたのアプリケーションは、サードパーティのアプリの代わりに、実行時のアクセス許可を必要とするプラットフォームのメソッドを呼び出すために、他のアプリが権限が必要な操作の実行を許可されているかを確認するために、適切なPermissionCheckerメソッドを使用する必要があります。

プラットフォームは互換モードを持っています。これは、レガシーアプリケーションが、権限により保護されたメソッドへのアクセスをユーザが取り消すことができます。

ユーザが互換モードでアクセスを取り消した場合、アプリの権限は実際には取り消されていません。代わりに

PermissionCheckerメソッドは、通常モードとレガシーモードの両方でアプリの権限を確認してください

訳注)ぶっちゃけると、他のアプリから呼ばれるような、サービス等のプログラムを書く時に、ちゃんと呼び出し元のパミッションチェックしようねという特に新しくもない話(プレインアプリ等を書く以外にはそんなケースは程んどないと思う)

サポートライブラリV13は以下のメソッドを提供します。

ActivityCompat.requestPermissions()
Mプレビューデバイスではない場合、ActivityCompat.OnRequestPermissionsResultCallbackでコールバックメソッドを呼び出します。
アプリが指定したパミッションを持っている場合は、PERMISSION_GRANTED、持っていない場合はPERMISSION_DENIEDを返します。

ActivityCompat.shouldShowRequestPermissionRationale()
Mプレビューデバイスで動いてない場合はfalseを返します。

V4サポートライブラリは、PermissionCheckerクラスが含まれています。PermissionCheckerクラスは、IPC(インタープロセスコミュニケーション)を使って他のアプリにサービスを提供するようなアプリのために、いくつかのスタティックユーティリティメソッドを提供します。例えばPermissionChecker.checkCallingPermission()は、指定されたパミッションを持っている特定のパッケージによって作成されたがかどうかチェックします。

まとめ

今回はサポートライブラリが拡充されました。ReleaseNotesを見ていると、GET_ACCOUNTSがdangreousになりCONTACTSグループに所属して、READPROFILE,とWRITE_PROFILEがCONTACTSグループから外れるとかありますが、パミッションやグループ周りはまだまだ変わりそうです。

またサポートライブラリには、結構致命的なバグがあるらしいので、動作確認等はちょっと待った方がよさそうです。