【Kotlin/Android Studio】パーミッション(権限)許可のリクエスト方法!requestPermissions
この記事からわかること
- Android Studio/Kotlinでパーミッション(権限)のリクエスト方法
- requestPermissionsメソッド・checkSelfPermissionメソッドの使い方
- 許可が必要になる機能
- RequestPermission/RequestMultiplePermissionsを使用したパーミッションダイアログの結果取得
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
環境
- Android Studio:Flamingo
- Kotlin:1.8.20
Androidで機能を使用する権限
Androidアプリからデバイスに組み込まれている機能(カメラや連絡先、Bluetooth機能など)を使用するためには使用する権限を明確に付与しておく必要があります。権限の宣言をしなくても一部機能を利用することもできたりしますが、使う機能によって権限が細分化されているので適切に権限を把握しておく必要があります。
必要となる権限の宣言方法は2種類あります。
- インストール時:Install time
- 実行時:Runtime
これは機能ごとに振られているレベル(Protection level
)によって異なります。以下の公式ページにて機能ごとにレベルが載っており、normal
ならインストール時、dangerous
なら実行時に必要になります。
インストール時のパーミッション宣言
normal
レベルの機能に関してはインストール時のみの宣言になります。これはプロジェクト内の「AndroidManifest.xml」ファイル内にuses-permission
タグを使用した形式で使用したい機能を記述するだけです。これでユーザーがアプリをインストールした際に自動的にアプリに権限が付与されます。
<uses-permission android:name="android.permission.BLUETOOTH" />
またアプリでインストール時の権限を宣言することで、アプリストアでユーザーがアプリの詳細ページを開いたときに、インストール時の権限に関するお知らせが表示されます。
実行時のパーミッション宣言
dangerous
レベルの機能に関してはインストール時と実行時の2箇所での宣言が必要になります。先ほど同様に「AndroidManifest.xml」ファイル内にuses-permission
タグを使用した形式で使用したい機能を記述するのとユーザーが機能を利用しようとした際などにアラートなどを表示し権限の許可を求めるリクエストを送信します。
またこのリクエストの送信についてはAndroid 6.0(API レベル 23)以上から必要になったものなのでそれ以前であればマニフェストファイルへの記載のみで問題ないようです。
権限の許可を求めるリクエストの送信方法
カメラ機能をリクエストするのを例に一度実装方法をまとめていきます。
流れ
- マニフェストファイルへの記述
- コードからパーミッションをチェック
- リクエストを送信
マニフェストファイルへの記述
まずはマニフェストファイル「AndroidManifest.xml」の中に権限を追加しておきます。
<uses-permission android:name="android.permission.CAMERA" />
追加するパーミッションのname
部分はManifest.permission
クラスに定義されている定数値を記述すればOKです。
コードからパーミッションをチェック:checkSelfPermission
コードからパーミッションが付与されているか(許可されているか)をチェックします。コードからもManifest.permission
オブジェクトから定数として参照することができます。
ここではcheckSelfPermission
メソッドを使用してパーミッションをチェックします。付与されていればPERMISSION_GRANTED
になります。
- 付与済:PackageManager.PERMISSION_GRANTED
- 未付与:PackageManager.PERMISSION_DENIED
if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "カメラ権限が許可されてないよ", Toast.LENGTH_SHORT).show()
// TODO: - リクエストを送信する処理
} else {
Toast.makeText(this, "カメラ権限の許可OK", Toast.LENGTH_SHORT).show()
}
アプリ初回起動時にはまだ許可されていないのでPERMISSION_DENIED
になります。なので許可されていない場合にリクエストを送信していきます。
Manifest
は手打ちしてもimport
文が自動で入らないことがあるので上部に以下を追加してください。
import android.Manifest
リクエストを送信:requestPermissions
リクエストを送信する方法は2つあります。まずはrequestPermissions
側から紹介していきます。
- requestPermissions
- registerForActivityResult
requestPermissions
メソッドを使用する場合は引数にリクエストを送信したい権限を配列形式で渡します。今回は1つだけですが複数渡すことも可能です。2つ目の引数にはリクエストコードを渡します。これはこのリクエスト処理を識別するためのコードなので適当な数値を渡しておきます。
val permissions = arrayOf(Manifest.permission.CAMERA)
val REQUEST_CODE = 100
requestPermissions(permissions,REQUEST_CODE)
このコードが実行されるとアプリ側で以下のようにアラートが表示されます。
リクエストの結果を受け取る
リクエストの結果はonRequestPermissionsResult
メソッドから受け取ることが可能です。引数requestCode
から対象のリクエストコード、grantResults
から許可または拒否された定数を受け取ることが可能です。先ほどのREQUEST_CODE
をクラスのプロパティとして定義し直してonRequestPermissionsResult
メソッド内からも参照できるようにしておきました。
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == REQUEST_CODE) {
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 許可された場合
Toast.makeText(this, "許可されました", Toast.LENGTH_SHORT).show()
} else {
// 拒否された場合
Toast.makeText(this, "拒否されました", Toast.LENGTH_SHORT).show()
}
}
}
リクエストを送信:registerForActivityResult
ここからはregisterForActivityResult
を使用したリクエスト送信方法を紹介していきます。
RequestPermission:単体
registerForActivityResult
の引数にRequestPermission
を渡すことで簡単にパーミッション許可申請ダイアログを表示することができます。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 許可ダイアログを表示
launcher.launch(Manifest.permission.CAMERA)
}
private val launcher =
registerForActivityResult(ActivityResultContracts.RequestPermission()) { result ->
// ダイアログの結果で処理を分岐
if (result) {
Toast.makeText(this, "許可されました", Toast.LENGTH_SHORT)
.show()
} else {
Toast.makeText(this, "否認されました", Toast.LENGTH_SHORT)
.show()
}
}
}
RequestMultiplePermissions:複数
複数のパーミッション許可申請ダイアログを表示するにはRequestMultiplePermissions
を指定します。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
launcher.launch(
arrayOf(
Manifest.permission.CAMERA,
Manifest.permission.ACCESS_COARSE_LOCATION
)
)
}
private val launcher =
registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) {
it
val camera = it[Manifest.permission.CAMERA] ?: false
val location = it[Manifest.permission.ACCESS_COARSE_LOCATION] ?: false
if (camera && location) {
Toast.makeText(this, "許可されました", Toast.LENGTH_SHORT)
.show()
} else {
Toast.makeText(this, "否認されました", Toast.LENGTH_SHORT)
.show()
}
}
}
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。