在之前的文章Android Activity Result API中介绍过如何使用Activity Result API 替换onActivityResult方法。本篇文章介绍下如何使用Activity Result API 实现权限申请。
实现权限申请
在之前的文章中提到过,ActivityResutlContract 已经有一些官方实现好的默认合约,其中就包含了权限申请合约RequestPermission和RequestMultiplePermissions,分别用于一次请求单个权限或者一次请求多个权限。
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)
}
}
}
效果图:
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))
}
}
效果图:
总结
使用Activity Result API 申请权限非常的方便,可以写在base类中,需要的时候直接调用。以后申请权限的功能可以不必再引入三方SDK来实现了。