Android Activity Result API (二) :权限申请

1,854 阅读1分钟

在之前的文章Android Activity Result API中介绍过如何使用Activity Result API 替换onActivityResult方法。本篇文章介绍下如何使用Activity Result API 实现权限申请。

实现权限申请

在之前的文章中提到过,ActivityResutlContract 已经有一些官方实现好的默认合约,其中就包含了权限申请合约RequestPermissionRequestMultiplePermissions,分别用于一次请求单个权限或者一次请求多个权限。

RequestPermission

申请单个权限实现代码如下:

class HomeActivity : FragmentActivity() {

    var requestPermissionName: String = ""
    val requestSinglePermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission()) { granted: Boolean ->
        if (granted) {
            //同意授权
            Log.d("-,-,-", "$requestPermissionName granted")
        } else {
            Log.d("-,-,-", "$requestPermissionName not granted")
            //未同意授权
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (!shouldShowRequestPermissionRationale(requestPermissionName)) {
                    //用户拒绝权限并且系统不再弹出请求权限的弹窗
                    //这时需要我们自己处理,比如自定义弹窗告知用户为何必须要申请这个权限
                    Log.e("-,-,-", "$requestPermissionName not granted and should not show rationale")
                }
            }
        }
    }


    @SuppressLint("InflateParams")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding: LayoutHomeActivityBinding = DataBindingUtil.setContentView(this, R.layout.layout_home_activity)
        binding.btnRequestSinglePermission.setOnClickListener {
            //请求定位权限
            requestPermissionName = Manifest.permission.ACCESS_FINE_LOCATION
            requestSinglePermissionLauncher.launch(requestPermissionName)
        }
    }
}

效果图:

1645247228636555.gif

activity result api single.png

RequestMultiplePermissions

申请多个权限实现代码如下:

    val requestMultiplePermissions = registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions: Map<String, Boolean> ->
        permissions.entries.forEach {
            val permissionName = it.key
            if (it.value) {
                //同意授权
                Log.d("-,-,-", "$permissionName granted")
            } else {
                Log.d("-,-,-", "$permissionName not granted")
                //未同意授权
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    if (!shouldShowRequestPermissionRationale(permissionName)) {
                        //用户拒绝权限并且系统不再弹出请求权限的弹窗
                        //这时需要我们自己处理,比如自定义弹窗告知用户为何必须要申请这个权限
                        Log.d("-,-,-", "$permissionName not granted and should not show rationale")
                    }
                }
            }
        }
    }

    @SuppressLint("InflateParams")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding: LayoutHomeActivityBinding = DataBindingUtil.setContentView(this, R.layout.layout_home_activity)
        binding.btnRequestMultiplePermissions.setOnClickListener {
            //请求读取存储空间权限和定位权限
            requestMultiplePermissions.launch(arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE,
                Manifest.permission.ACCESS_FINE_LOCATION))
        }
    }

效果图:

1645248955351410.gif

activity result api multiple.png

总结

使用Activity Result API 申请权限非常的方便,可以写在base类中,需要的时候直接调用。以后申请权限的功能可以不必再引入三方SDK来实现了。