Android
新機能

Android Marshmallow対応!Permissions事始め

More than 1 year has passed since last update.

Androidの新OS正式版もそろそろ発表されそうです。
既存アプリで対応が必須と思われるPermissionsについてまとめます。

参考:http://developer.android.com/preview/features/runtime-permissions.html

AndroidにおけるPermissionとは

各機能へのアクセス権限のことです。
開発者が必要な権限をユーザーに提示し、ユーザーが許可することによってその権限を使うことができるようになります。

MのPermissionモデルの概要

・~5.X.X

ユーザーはアプリのマニフェストでリストされているすべてのパーミッションを付与するように要求されます。
一度許可すると拒否することはできないです。

・6.0~

ユーザーは必要なときに必要なパーミッションを付与するように要求されます。
一度許可したあとでも拒否することが可能になります。

今までは、インストール時に全てのパーミッションが求められ、許可しない限りインストールを行うことができませんでした。
今後は、ユーザーが自由に許可/拒否できるようになります(全てのパーミッションがそうなるわけではありません)。

ユーザー視点の処理の流れ

1. PlayStoreからアプリをインストールする

インストールの際、ユーザーはPROTECTION_NORMALレベルのPermissionの要求をされます。
Permissionにはレベルがあり、PROTECTION_NORMAL以外にもPROTECTION_DANGEROUSなどがあります。
PROTECTION_NORMALは危険性が少ないレベルとされており、android.permission.INTERNETなどが含まれます。

2. インストールが完了し、アプリを使い始める

アプリを使い始めます。

3. 使用する機能に応じてPermissinosを求められる

ユーザーはPermissionが必要な機能を使用しようとしたときに、Permissionを要求されます。
このときに要求されるのは、PROTECTION_NORMAL以外のPermissionです。
Permissionの要求に対して、ユーザーは許可しても許可しなくてもOKです。
ですが、許可しなかった場合はその機能を使うことはできません。
あとで許可/拒否を変更することも可能です。設定アプリから変更することができます。

開発者視点の処理の流れ (サンプルコードが参考サイトにあります)

・Permissionが許可されているか調べる

Permissionが必要な処理を行う場合、Permissionが許可されているか調べます。
この処理は一度Permissionが許可された後でも行う必要があります。
なぜならば、ユーザーはいつでも自由にPermissionの許可を変更することができるからです。
チェックは以下のメソッドを使って行います。

checkSelfPermission (String permission)

・Permissionを要求する

必要に応じて、Permissionをユーザーに要求します。
要求は以下のメソッドを使って行います。

requestPermissions (String[] permissions, int requestCode)

・要求に対する応答に応じた処理をする

ユーザーの応答に応じた処理をします。
許可した場合、拒否しなかった場合の処理を考える必要があります。
応答への処理は以下のコールバックメソッドを使って行います。

onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)

下位互換

  アプリのtargetSDK=M アプリのtargetSDK=M以外
端末OSがM 新しいPermissionモデル インストール時にすべてのPermissionが要求される
ただし、設定アプリから許可を取り消すことは可能
端末OSがM以外 インストール時にすべてのPermissionが要求される
(今までと同じ動き)
インストール時にすべてのPermissionが要求される
(今までと同じ動き)

端末OSがM かつ targetSDK=M以外 の場合、
インストール時にすべてのPermissionが要求されます。ここは今までの動きと変わりません。
しかし、設定アプリから許可を取り消すことが可能になります。
設定アプリから許可を取り消したPermissionが必要な処理を行うと、エラー、もしくは空のデータが返ってきます。

Best Practice

開発者が気をつけるべきことです。

1.必要なPermissionだけを要求する

必要なものだけを要求します。

2.要求するタイミング

たとえば10個のPermissionが必要だった場合、最初の起動時にすべてのPermissionを要求するほうがユーザーを「疲れさせない」かもしれません。
要求するタイミングは開発者が決めることができます。ユーザーを疲れさせない要求のタイミングを考えましょう。

3.必要な理由を説明する

たとえば、カメラアプリでカメラのPermissionを求められるのはユーザーにとって納得感があります。
しかし、電話帳へのアクセスを求められた場合はすんなりと納得するのは難しいと思われます。
そんなときは、なぜこのPermissionが必要なのかをユーザーに説明する必要があります。

「要求するタイミング」、の項で起動時にすべてのPermissionを求める方法もある、と説明しました。
それと同時に、納得感を得られないPermissionの要求をする場合は、なぜ必要なのかを説明したほうがよいです。
説明が必要なPermissionの要求は、起動時にほかのPermissionを要求するのと一緒に要求するのではなく、使うタイミングで要求したほうがよいです。

まとめ

  • ユーザーが自由にアプリのパーミッションを許可/拒否できるようになります
  • ユーザーは、一度パーミッションを許可したあとでも拒否できるようになります
  • 開発者のアプリへの対応が必要です