Android-封装一个超好用的权限工具类

32 阅读2分钟

封装一个好用的原生权限工具类,方便以后开发直接拿来用。

思考1:工具类应具备的能力

  1. 权限判断

  2. 权限请求

  3. 权限回调处理 (权限同意、权限拒绝、权限拒绝且不再询问)

思考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)
                }
            }
        }
    }

}