封装一个好用的原生权限工具类,方便以后开发直接拿来用。
思考1:工具类应具备的能力
权限判断
权限请求
权限回调处理 (权限同意、权限拒绝、权限拒绝且不再询问)
思考2:
核心API:
权限判断-API:
ContextCompat.checkSelfPermission
小贴士tips:
有权限 PackageManager.PERMISSION_GRANTED
无权限 PackageManager.PERMISSION_DENIED
无权限且不再询问 PackageManager.PERMISSION_DENIED + !activity.shouldShowRequestPermissionRationale(permission)
核心API:
权限请求与回调-API:
- 方案1(旧版):ActivityCompat.requestPermissions 与 ComponentActivity-重写onRequestPermissionsResult
- 方案2(推荐):ComponentActivity-registerForActivityResult().launch 与 ComponentActivity-registerForActivityResult()
方案1这菜有点老,我们整点新鲜的方案2。
开始上菜~
一、构建权限工具类:PermissionNewHelper
class PermissionNewHelper {
var denialList = mutableListOf<String>()
var denialNeverList = mutableListOf<String>()
var requestCode = 0
fun createPermissionLauncher(activity: ComponentActivity, nextUnit:((Int)-> Unit)? = null, denialUnit:(()-> Unit)? = null, neverUnit:(()-> Unit)? = null):ActivityResultLauncher<Array<String>>{
return activity.registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions(),object :
ActivityResultCallback<Map<String, Boolean>>{
override fun onActivityResult(result: Map<String, Boolean>) {
denialList.clear()
denialNeverList.clear()
result.forEach {(permission, isGranted) ->
if (isGranted) {
// 权限已授予
} else {
denialList.add(permission) // 权限被拒绝,可提示用户手动开启
if (!activity.shouldShowRequestPermissionRationale(permission)) {
denialNeverList.add(permission) // 用户选择了"不再询问",需引导至设置页面
}
}
}
if (denialList.size == 0) {
nextUnit?.invoke(requestCode)
} else {
if (denialNeverList.size == 0) {
denialUnit?.invoke()
}else{
neverUnit?.invoke()
}
}
}
})
}
fun checkPermissions(context: Context, vararg permissions: String): Boolean{
return permissions.all { permission->
ContextCompat.checkSelfPermission(context,permission) == PackageManager. PERMISSION_GRANTED
}
}
/**
* 获取权限
*/
fun requestPermissions(launcher:ActivityResultLauncher<Array<String>>, permissions: Array<String>, requestCode: Int){
this.requestCode = requestCode
launcher.launch(permissions)
}
}
权限弹框辅助类:PermissionDialogHelper
class PermissionDialogHelper {
//申请权限的说明弹框
fun showPermissionRequestPop(context: Context, des:String, next:()-> Unit){
showPop(context,des,next)
}
//跳转权限设置页的说明弹框(权限拒绝且不再提示)
fun showPermissionJumpSettingPop(context: Context, des:String, next:()-> Unit){
showPop(context,des,next)
}
private fun showPop(context: Context, des:String, next:()-> Unit){
var create :AlertDialog? = null
val dialog = AlertDialog.Builder(context).setTitle("温馨提示").setMessage(des)
.setNegativeButton("取消", object :
DialogInterface.OnClickListener {
override fun onClick(dialog: DialogInterface?, which: Int) {
create?.dismiss()
}
}).setPositiveButton("确定", object : DialogInterface.OnClickListener {
override fun onClick(dialog: DialogInterface?, which: Int) {
create?.dismiss()
next()
}
})
create = dialog.create()
create?.show()
}
}
二、工具类的使用:
class PermissionNewActivity: ComponentActivity() {
var permission: Array<String> = arrayOf(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.CAMERA)
val mPermissionNewHelper by lazy { PermissionNewHelper() }
val mPermissionDialogHelper by lazy { PermissionDialogHelper() }
lateinit var mPermissionLauncher :ActivityResultLauncher<Array<String>>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_test)
mPermissionLauncher = mPermissionNewHelper.createPermissionLauncher(this@PermissionNewActivity, { code->
if(code==7777){
Toast.makeText(this@PermissionNewActivity, "next", Toast.LENGTH_SHORT).show()
}
}, {
Toast.makeText(this@PermissionNewActivity, "denial", Toast.LENGTH_SHORT).show()
}, {
Toast.makeText(this@PermissionNewActivity, "never", Toast.LENGTH_SHORT).show()
mPermissionDialogHelper.showPermissionJumpSettingPop(this@PermissionNewActivity, "跳转系统设置权限的描述") {
//前往系统设置
val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
intent.setData(Uri.parse("package:${this@PermissionNewActivity.packageName}"))
startActivity(intent)
}
})
findViewById<Button>(R.id.mBtn).setOnClickListener {
val check = mPermissionNewHelper.checkPermissions(this@PermissionNewActivity,*permission)
if(check){
Toast.makeText(this@PermissionNewActivity, "next", Toast.LENGTH_SHORT).show()
}else{
mPermissionDialogHelper.showPermissionRequestPop(this@PermissionNewActivity,"请求权限的描述") {
mPermissionNewHelper.requestPermissions(mPermissionLauncher,permission,7777)
}
}
}
}
}