0
3

More than 3 years have passed since last update.

新しいAndroidランタイムパーミッションのAPIを使ってみる

Posted at

Android 6.0で導入されたランタイムパーミッションですが、定型文が多い上に結果の受け取りがonRequestPermissionsResultのオーバーライドによる非同期処理となるため非常に使いづらく、ややこしくなりがちでした。昔記事を書いていたのがこちら。
https://qiita.com/niusounds/items/f8852534bd3135d89dcc

そんなランタイムパーミッションのAPIが、androidx.activity 1.2.0でより使いやすくシンプルなAPIになりました!

たとえばstartRecordButtonというボタンを押すと端末のマイクから音声入力を録音する処理startRecording()が実行されるアプリを作っているとしたら、以下のような感じのコードになります。

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 最初にregisterForActivityResultしておく(onStartまでにやっておく必要があるらしい)
        val requestPermission = registerForActivityResult(ActivityResultContracts.RequestPermission()) { result ->
            // パーミッションリクエストの結果を処理する
            // パーミッションが許可されたらresult=true
            if (result) {
                startRecording()
            }
        }

        startRecordButton.setOnClickListener {
            checkPermission(requestPermission)
        }
    }

    // 引数でrequestPermissionを渡してみたが、フィールドに保持するでも良いと思う
    private fun checkPermission(requestPermission: ActivityResultLauncher<String>) {
        // パーミッション許可済みかどうかの判定。これは今まで通り変わらず。
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED) {
            startRecording()
        } else {
            // ランタイムパーミッションのダイアログを出す
            requestPermission.launch(Manifest.permission.RECORD_AUDIO)
        }
    }
}

※丁寧にやるならランタイムパーミッションのダイアログを出す前にActivityCompat.shouldShowRequestPermissionRationaleを問い合わせて以前に拒否したことがあるかどうかを調べた方が良いと思います。

requestCodeを自分で定義したりonRequestPermissionsResultをオーバーライドして定型文的なコードを書いたりしなくて良くなったので、だいぶスッキリしました。
なんでもっと早く導入されなかったんですかね〜!

0
3
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
0
3