2015年6月1日月曜日

[android]Runtime Permissions

Runtime Permissionsは次期android M(8月?, 9月くらい?)で追加される機能です。
ここに詳しく書いてあります。
自分の理解した範囲で書きます。
あくまでも現時点のM Developer Previewでの話です。
・これまではインストール時にパーミッションの許可をユーザに委ねていた
・android Mではパーミッションが必要になったタイミングでユーザに許可をもとめるようにする
・ユーザーは設定画面から許可したパーミッションの取り消しをいつでもおこなえる
・targetSdkVersionをMにしなければ旧来通りのインストール時にすべてのパーミッションを求めるモデルになる。ただしこの場合でもユーザーは設定画面からパーミッションの取り消しを行える。パーミッションの取り消しが行われると、パーミッションが必要なAPIを呼び出したときに例外は起きないが空データが返る等の動作になる(やっぱりこのRuntime Pemissionsの対応は必須のようです)
・すべてのPermissionについてあてはまるわけではなく、PROTECTION_NORMALのものは旧来通りのモデル(インストール時に許可を求める)
・PROTECTION_NORMALて何なの? というと例として、alarm clock、internetが挙げられています
・新しいパーミッションモデルではManifestに<uses-permission-sdk-m>で指定をします。正式リリースでは変わるかも? 変わらないかも?
・パーミッションがあるかないかはContext#checkSelfPermission(String)で調べられる。戻り値はint。PackageManager.PERMISSION_GRANTEDが許可されているintの値。
・Activity#requestPermissions(String[], int)でパーミッションの許可を求める。String[]なのでたぶん一度に複数のパーミッションを要求することができる。これを呼び出すとandroidが許可しますか? ダイアログを出してくれる。第2引数intは許可を求めた結果コールバックの識別に使う
・Activity#onRequestPermissionsResult(int, String[], int[]) : Activity#requestPermissions(String[], int)の結果コールバック。第1引数はrequestPermissionsのintと対応。int[]の要素がPackageManager.PERMISSION_GRANTEDになっているものは許可をされたという意味になる
・Activity#requestPermissionsコール時にandroidが表示するダイアログは「もう一度聞かない」オプションも用意する。これにチェックが入って拒否をされると、Activity#requestPermissionsは即座に拒否される
・テストのためにadbコマンドでパーミッションの許可/拒否ができる
・ベストプラクティス
 ・必要なパーミッションだけを要求する。拒否されたら代替手段を提供する。たとえばカメラの許可がおりなかった時は、暗黙的Intentで別のカメラアプリに撮ってもらう
 ・1度にたくさんのパーミッションを要求しない
 ・なぜパーミッションを必要とするのかを説明する

【サンプルコード】
https://github.com/googlesamples/android-RuntimePermissions

読んでみました。
最初の画面でボタンを押したときのメソッドは下記です。これらはR.layout.fragment_mainのなかでandroid:onClickで指定されています。
com.example.android.system.runtimepermissions.MainActivity#showCamera
com.example.android.system.runtimepermissions.MainActivity#showContacts

この例ではカメラと電話帳のパーミッションを求めています。
許可されていたら、com.example.android.system.runtimepermissions.camera.CameraPreviewFragmentかcom.example.android.system.runtimepermissions.contacts.ContactsFragmentをreplaceしています。これらのFragmentも興味深いのですが割愛します。ContactsFragmentのほうは電話帳へのダミーデータの挿入などがあります。CameraPreviewFragmentはあんまりわかりません。

パーミッションが許可されているかどうかはcom.example.android.system.runtimepermissions.PermissionUtil#hasSelfPermission(android.app.Activity, java.lang.String)というヘルパーメソッドで調べています。中ではContext#checkSelfPermission(String)を使っています。

パーミッションが許可されていなければActivity#requestPermissions(String[], int)で求める。その結果はActivity#onRequestPermissionsResult(int, String[], int[]) で返される。

こんな感じです。
カレンダー、カメラ、電話帳、位置情報等個人情報が特定されるようなパーミッションを必要とするアプリを作るときは注意が必要そうです。

よくわからないのがこれの対象となるパーミッションがどれが該当するのかということです。もしかすると、http://developer.android.com/preview/features/runtime-permissions.htmlのTable 1に書いてあるやつが対象?

従来はインストール時にすべての許可を要求していた




Mからは必要なものは必要なときに




0 件のコメント:

コメントを投稿