android6.0新しいパーミッションモデルへの対応_devfest kyoto lt
TRANSCRIPT
Android 6.0 新しいパーミッションモデルへの対応
2015/10/17 DevFest Kyoto
self-introduction
twitter @KatsukiNakatani
Facebook Katsuki.Nakataniお仕事大阪の SIer でインフラ ( サーバーとかルーターとか。。。 ) のエンジニアをしてます
個人でアプリ作ってますAndr
oidWindows
Store
中谷 克紀名前
パーミッションモデルの変更従来までのパーミッションモデル
インストール時の同意で Manifest のすべてのパーミッションが付与されユーザは任意でパーミッションを剥奪することが出来ない
今まであった問題点パーミッションを追加すると、自動更新できず ( 再度同意が必要 )アプリが古いまま利用されているケースがある。
※ 例えば電話帳を参照するアプリがあったとして、アプリ更新時に 位置情報が欲しいのでパーミッションを追加するとか
パーミッションモデルの変更6.0 からのパーミッション
インストール時に危険 (※) ではないパーミッションのみ付与し危険なパーミッションは付与しない危険なパーミッションはアプリ内で、ユーザーが許可する
https://support.google.com/googleplay/answer/6270602?hl=ja
Android6.0 以降向けに開発されたアプリ?危険か危険じゃないパーミッションかどうかはこちらで確認http://developer.android.com/intl/ja/guide/topics/security/permissions.html#perm-groupspermission_group に属しているパーミッションとグループに属さないけど、 PROTECTION_DANGEROUS のやつっぽい
TargetSDK で動作が変わるTargetSDK/ 権限 端末の OS 通常のパーミッション 危険なパーミッション
236.0
インストール時に付与 付与されない<23 インストール時に付与 インストール時に付与
- 6.0 未満 インストール時に付与 インストール時に付与アプリ対応しなくても 6.0 端末でパーミッション関係は問題なさそう
違う。そうじゃない。
パーミッションの剥奪が可能TargetSDK が 23 未満のアプリでも、 6.0 では後から設定画面でパーミッションを剥奪することが可能( 危険なパーミッション以外は剥奪できない )
危険なパーミッションを利用する端末は必然的に対応する必要がある
でもね?Android6.0 の端末が出るのなんて半年ぐらい先じゃないの?
アップデートされたら本気出すわ〜とか思ってません?
日本で使える Android6.0 端末結構でるよね?発売日 発売元 / キャリア 端末
2015/10 Google Nexus5X2015/10~11 Google Nexus6P
2015/10 docomo Nexus5X2015/10/20 Y!mobile Nexus5X2015/10~11 Softbank Nexus6P
直近で発売予定の端末
配信 発売元 / キャリア 端末済 Google Nexus5済 Google Nexus6済 Google Nexus7(2013)済 Google Nexus9済 Google NexusPlayer済 Y!mobile Nexus5
アップデート端末
Nexusばっかりじゃんと思いますが新しいパーミッションモデルの対応をしましょう
パーミッションフロー ( 例 )
パーミッションが許可されているかチェック
処理継続
パーミッション要求YES
NO
ユーザーが許可した ?YES
エラーメッセージ等NO
パーミッションフロー ( 例 )
パーミッションが許可されているかチェック許可されていれば発信
パーミッションがない場合、パーミッションを要求するダイアログを上げる
パーミッションフロー ( 例 )
結果を callback で受け取り、許可だったか確認し許可なら発信パーミッションがない場合、 Toast 表示
Permission が一つの場合はいいけど、増えるとコードが汚くなる
PermissionsDispatcher を使ってみよう
・アノテーションで、パーミッション処理を簡略化・コードが全体的に見やすくなる・ generate されたコードが見えるため、動きがおかしい場合も追いやすい
https://github.com/hotchemi/PermissionsDispatcher
この資料は version1.2.1 を元に書いていますbuild.gradle への dependency などの追加は github 参照してください
PermissionsDispatcher( 使い方 )1. パーミッションチェックする Activity or Fragment に @RuntimePermissions を追加
2. パーミッションがほしいメソッドに @NeedsPermission(“< ほしいパーミッション >”) を追加
3 . ダイアログで拒否した場合に発生させたいメソッドに @DeniedPermission(“< ほしいパーミッション >”) を追加 ( 任意 )
4 . ビルドします5 . クラス名 PermissionsDispatcher が自動生成されます
PermissionsDispatcher( 使い方 )6.onRequestPermissionResult の callback に先ほど generate されたメソッドを呼ぶように追加します
7.最後にパーミッションを要求したいメソッドを generate されたメソッドで呼び出しますクラス名 PermissionsDispatcher. メソッド名 WithCheck(Context context)
※他にも Optionalで使えるパーミッションがあるので githubで確認してみてください
全体の比較自前で実装すると if 文も結構増えるよね。。
コード比較PermissionsDispatcher を使ったら if 文もなく、各役割ごとのメソッドに分かれるので見やすい!
まとめ危険なパーミッション使ってるアプリが有るのであれば、対応しよう! http://developer.android.com/intl/ja/guide/topics/security/permissions.html#perm-groups
PermissionsDispatcher 使ったほうがコードの見通しが良くなるよ