注意:本記事については、弊社でもどうするのがベストプラクティスなのか掴みかねております。その点を留意してお読みください。
Andorid M (6.0)のPreview 2から、ActivityクラスにshouldShowRequestPermissionRationaleというメソッドが追加されています。rationaleとは「理論的根拠」とかそんな感じの意味があるので、このメソッドは「パーミッション要求の根拠を表示すべきかどうか」を判定するためのものであることが名前からわかります。
実際、Previewのドキュメントでもそういう風に使うように記載されています。
しかし、このメソッドの挙動が少し不思議です。
- まだ一度も要求していないパーミッションを渡した場合、falseが返る
- 要求したパーミッションが拒絶されたことがあり、かつ今後表示しないチェックがつけられていない場合、trueが返る
- 要求したパーミッションが、今後表示しないというチェックを入れて拒絶された場合、falseが返る
上記のような挙動になります。
ここで不思議なのは1番目です。初回のパーミッション要求の前にも、そのパーミッションをどういう根拠で求めるのかはユーザに提示した方が良いのではないかと思われますが、このAPIに従った場合、表示しないというパスに流れます。
また、PreviewのAPI Overviewに示されたコードも不思議です。
if (checkSelfPermission(Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (shouldShowRequestPermissionRationale(
Manifest.permission.READ_CONTACTS)) {
// Explain to the user why we need to read the contacts
}
requestPermissions(new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
// MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
// app-defined int constant
return;
}
このコードを参考にして実装すると、shouldShowRequestPermissionRationale()の結果がtrueであったときに説明を表示します。たとえばダイアログで表示するなどが考えられますが、その場合はダイアログ表示している間にrequestPermissions()がすでに呼び出され、外部アプリ(PackageInstallerアプリ)による権限確認ダイアログの表示に遷移してしまうことでしょう。
以上から、このサンプルコードをベースに書くのはベストプラクティスでは無いだろうと考えています。
ということで、現時点ではどうするのが良いのかについてはまだ模索中です。二つの問題点とうまく折り合いをつけたベストプラクティスがGoogleから提示されることを期待しています。