🐙

もう権限取得で悩まない

2020/09/29に公開

Noteの記事を加筆修正したものです。

Activity 1.2.0-alpha02とFragment 1.3.0-alpha02 から追加されたActivityResultContractsを使うとonActivityResultの受け取り処理が見やすくなりますが、権限の取得を簡単に行う事もできるので紹介します。

公式(https://developer.android.com/training/basics/intents/result?el=en)

Manifestに必要な権限を記載

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="sobaya.example.allflow">

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

今回は位置情報の権限を取得しています。

Activityで権限取得

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_DENIED) {
            test()
        } else {
            println("もう権限もってる")
        }
    }

    fun test() {
        val rp = ActivityResultContracts.RequestPermission()
        val getContent = registerForActivityResult(rp) {
            if (it) {
                println("権限取得")
            } else {
                println("だめだった")
            }
        }
        getContent.launch(Manifest.permission.ACCESS_FINE_LOCATION)
    }

解説

ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_DENIED

ここで最初に権限をすでに持っていないかどうかの確認を行っています。
権限が無い場合にはtestメソッドを呼び出します。

testメソッド内は見たとおりになりますが、権限取得をする準備をし、
onActivityResultを受け取った時の処理を用意して、
権限の取得を行います。

実行結果

I/System.out: 権限取得
I/System.out: もう権限もってる

サンプルコード

https://github.com/sobaya-0141/AllFlow/tree/use_ActivityResultContracts

Discussion