8
9

More than 3 years have passed since last update.

【Android】カメラ等の権限リクエスト実装方法まとめ

Posted at

概要

自作のアプリでカメラやマイクを使いたい、位置情報を取得したい、などで、ユーザーに権限を許可してもらいたいときがあります。Android 6.0(API レベル 23)以降では、実行時に必要な権限を許可するようリクエストする必要があります(それ以前はアプリのインストール時にまとめてリクエストされる)。
権限リクエストの実装方法をまとめます。必要な権限はAndroidManifestに記述しておいてください。

権限をリクエストする

以下ではカメラの権限をリクエストすることにします。

まず、現在のカメラのアクセス権限の状態を確認します。
checkSelfPermission()で特定の権限があるかどうかをチェックします。ある場合は0(PackageManager.PERMISSION_GRANTED)、ない場合は1(PackageManager.PERMISSION_DENIED)が返ります。

val cameraPermission = ContextCompat.checkSelfPermission(context!!, Manifest.permission.CAMERA)

(ここで既に権限がある(granted)場合は、そのままカメラ起動などの処理に進んでください:relaxed:

そして、カメラの権限をリクエストします。
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】アプリの権限を許可してもらうために「設定」を開きたい

参考

8
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
9