概要
自作のアプリでカメラやマイクを使いたい、位置情報を取得したい、などで、ユーザーに権限を許可してもらいたいときがあります。Android 6.0(API レベル 23)以降では、実行時に必要な権限を許可するようリクエストする必要があります(それ以前はアプリのインストール時にまとめてリクエストされる)。
権限リクエストの実装方法をまとめます。必要な権限はAndroidManifest
に記述しておいてください。
権限をリクエストする
以下ではカメラの権限をリクエストすることにします。
まず、現在のカメラのアクセス権限の状態を確認します。
checkSelfPermission()
で特定の権限があるかどうかをチェックします。ある場合は0(PackageManager.PERMISSION_GRANTED
)、ない場合は1(PackageManager.PERMISSION_DENIED
)が返ります。
val cameraPermission = ContextCompat.checkSelfPermission(context!!, Manifest.permission.CAMERA)
(ここで既に権限がある(granted)場合は、そのままカメラ起動などの処理に進んでください)
そして、カメラの権限をリクエストします。
requestPermissions()
で特定の権限を許可するようにユーザーにリクエストします。第二引数で複数の権限を指定することで、まとめてリクエストできます。
ここで表示されるAndroid標準ダイアログはカスタマイズできません。
if (cameraPermission != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(activity!!, arrayOf(Manifest.permission.CAMERA), REQUEST_PERMISSION) // REQUEST_PERMISSION は定数
}
これで単純な権限リクエストは完了です。
権限リクエストの説明を表示する
例えば、「この機能を使うにはカメラの権限を許可してください」のような権限リクエストについて説明を表示したいときがあります。許可されていない(denied)場合に毎回表示する方法の他に、shouldShowRequestPermissionRationale()
を使って、ユーザーがリクエストを許可しなかったことがある場合のみ表示する方法もあります。
shouldShowRequestPermissionRationale()
は、以前ユーザーがリクエストを許可しなかった場合true
を返しますが、「今後表示しない」を選択していた場合はfalse
を返します。
ダイアログで「今後表示しない」が選択された後にリクエストが必要な場合
ユーザーがカメラの権限リクエストで「今後表示しない」を選択した後に、「やっぱりカメラ機能を使いたい……」と考えるかもしれません。その場合、デバイスの「設定」で権限を許可するしかなく、再び権限リクエストのダイアログを表示することはできません。
権限が許可されている場合、shouldShowRequestPermissionRationale()
はfalse
を返します。「今後表示しない」を選択していたときに何かアクションをしたい(「"設定"で許可してください」のような説明を表示するなど)場合は、checkSelfPermission()
とshouldShowRequestPermissionRationale()
の両方を確認する必要があります。
val cameraPermission = ContextCompat.checkSelfPermission(context!!, Manifest.permission.CAMERA)
val cameraRationale = ActivityCompat.shouldShowRequestPermissionRationale(activity!!, Manifest.permission.CAMERA)
if (cameraPermission != PackageManager.PERMISSION_GRANTED) {
if (cameraRationale) {
ActivityCompat.requestPermissions(activity!!, arrayOf(Manifest.permission.CAMERA), REQUEST_PERMISSION)
} else {
AlertDialog.Builder(context!!)
.setMessage("デバイスの「設定」でカメラの権限を許可してください。")
.setPositiveButton("OK") { _, _ ->
// OK button pressed
}
.create().show()
}
}
上記のコード例で、PositiveButtonを押した後に設定画面を開くようにする場合は、こちらの記事もご覧ください: 【Android】アプリの権限を許可してもらうために「設定」を開きたい
参考