🎉

[Android][Kotlin]パーミッション取得のサンプルコードを作ってみた。

に公開

いつもいつも、権限まわりで検索して調べてって、すごい時間をとられてしまうので、いい加減サンプルコードを作ってみた。

https://github.com/aaaa1597/AndKot-PermissionSample

Abstract

  • Androidのパーミッション取得のサンプルコード
  • 簡単な説明

説明

onCreate()で、権限チェック関数(自作)を呼ぶ。

override fun onCreate(savedInstanceState: Bundle?) {
    ...
    /* 権限(s)チェック */
    val checkOK = checkPermissions()    /* ←自前の関数 */
    if(checkOK) {
        /* ★★★ここに権限チェックOK後の処理 */
        Toast.makeText(this, "権限OK", Toast.LENGTH_SHORT).show()
    }
}

権限を持たなければ、ActivityResultLauncher.launch()。

必要に応じて下記コードの権限を変更する。
val permissions = arrayOf(Manifest.permission.POST_NOTIFICATIONS,

    private fun checkPermissions(): Boolean {
        /* 複数の権限チェック */
        val permissions = arrayOf(Manifest.permission.POST_NOTIFICATIONS, /*複数時はここに並べる*/)
        /* 未許可権限を取得 */
        val deniedPermissions: MutableList<String> = ArrayList()
        for (permission in permissions) {
            if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED)
                deniedPermissions.add(permission)
        }

        /* 未許可権限チェック */
        if(deniedPermissions.isEmpty())
            return true  /* 権限付与済 何もする必要ない */

        val fstLaunch = sharedPref.getBoolean(PREFKEY_FIRST_LAUNCH, true)
        if(fstLaunch) {
            /* 未許可権限があれば許可要求 */
            permissionLauncher.launch(deniedPermissions.toTypedArray())
            sharedPref.edit(commit=true) { putBoolean(PREFKEY_FIRST_LAUNCH, false)}
        }
        else {
            val rationaleNeeded = deniedPermissions.any { permission ->
                ActivityCompat.shouldShowRequestPermissionRationale(this, permission)
            }

            if(rationaleNeeded) {
                /* 以前に拒否った */
                permissionLauncher.launch(deniedPermissions.toTypedArray())
            }
            else {
                /* 以前に"非表示にした"ならアラートダイアログ → Shutdown */
                PermissionDialogFragment.show(this, R.string.wording_permission_2times)
            }
        }
        return false
    }

ActivityResultLauncherの実装

    private val permissionLauncher = registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) {
        isGranted: Map<String, Boolean> ->
            /* 権限チェック */
            if (isGranted.all({it.value == true})) {
                /* ★★★ここに権限チェックOK後の処理 */
                Toast.makeText(this, "権限OK", Toast.LENGTH_SHORT).show()
                return@registerForActivityResult    /* 全て許可済 問題なし */
            }
            else {
                /* ひとつでも権限不足ありならアラートダイアログ→Shutdown */
                PermissionDialogFragment.show(this, R.string.wording_permission)
            }
    }

あと strings.xmlの実装

<resources>
    <string name="app_name">PermissionSample</string>
    <string name="req_permission">権限要求</string>
    <string name="wording_permission">\nこのアプリにはこの権限が必要なんです。あなたの許可をください。\nアプリ終了します。</string>
    <string name="wording_permission_2times">\nアプリ終了します。\n今このアプリは\"表示しない\"設定になっていまして。\nアンインストール → 再インストールして下さい。</string>
</resources>

これで権限取得はあらかた大丈夫なはず。
※25.08.31 Windowleakedが発生していたので、修正。

Discussion