使用Kotlin写的Android动态权限检查

一:权限检测器

class PermissionsChecker(context: Context) {

    private var mContext: Context = context.applicationContext

    // 判断权限集合
    fun lacksPermissions(vararg permissions: String): Boolean {
        for (permission in permissions) {
            if (lacksPermission(permission)) {
                return true
            }
        }
        return false
    }

    // 判断是否缺少权限
    private fun lacksPermission(permission: String): Boolean {
        return ContextCompat.checkSelfPermission(mContext, permission) == PackageManager.PERMISSION_DENIED
    }
}

二:获取权限的页面

class PermissionsActivity : AppCompatActivity() {

    private var mChecker: PermissionsChecker? = null // 权限检测器
    private var isRequireCheck: Boolean = false // 是否需要系统权限检测

    // 返回传递的权限参数
    private val permissions: Array<String> get() = intent.getStringArrayExtra(EXTRA_PERMISSIONS)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        if (intent == null || !intent.hasExtra(EXTRA_PERMISSIONS)) {
            throw RuntimeException("PermissionsActivity需要使用静态startActivityForResult方法启动!")
        }

        setContentView(R.layout.activity_permissions)//布局默认就行,不用有View,就是为了弹出框提示

        mChecker =PermissionsChecker(this)
        isRequireCheck = true
    }

    override fun onResume() {
        super.onResume()
        if (isRequireCheck) {
            val permissions = permissions
            if (mChecker!!.lacksPermissions(*permissions)) {
                requestPermissions(*permissions) // 请求权限
            } else {
                allPermissionsGranted() // 全部权限都已获取
            }
        } else {
            isRequireCheck = true
        }
    }

    // 请求权限兼容低版本
    private fun requestPermissions(vararg permissions: String) {
        requestPermissions(this, permissions, PERMISSION_REQUEST_CODE)
    }

    // 全部权限均已获取
    private fun allPermissionsGranted() {
        setResult(PERMISSIONS_GRANTED)
        finish()
    }

    /**
     * 用户权限处理,
     * 如果全部获取, 则直接过.
     * 如果权限缺失, 则提示Dialog.
     *
     * @param requestCode  请求码
     * @param permissions  权限
     * @param grantResults 结果
     */
    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
        if (requestCode == PERMISSION_REQUEST_CODE && hasAllPermissionsGranted(grantResults)) {
            isRequireCheck = true
            allPermissionsGranted()
        } else {
            isRequireCheck = false
            showMissingPermissionDialog()
        }
    }

    // 含有全部的权限
    private fun hasAllPermissionsGranted(grantResults: IntArray): Boolean {
        for (grantResult in grantResults) {
            if (grantResult == PackageManager.PERMISSION_DENIED) {
                return false
            }
        }
        return true
    }

    // 显示缺失权限提示
    private fun showMissingPermissionDialog() {
        val builder = AlertDialog.Builder(this@PermissionsActivity)
        builder.setTitle("标题")
        builder.setMessage("权限缺失")
        // 拒绝, 退出应用
        builder.setNegativeButton("退出") { _, _ ->
            setResult(PERMISSIONS_DENIED)
            finish()
        }
        builder.setPositiveButton("设置") { _, _ -> startAppSettings() }
        builder.show()
    }

    // 启动应用的设置
    private fun startAppSettings() {
        val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
        intent.data = Uri.parse(PACKAGE_URL_SCHEME + packageName)
        startActivity(intent)
    }

    companion object {

        const val PERMISSIONS_GRANTED = 0 // 权限授权
        const val PERMISSIONS_DENIED = 1 // 权限拒绝

        private const val PERMISSION_REQUEST_CODE = 0 // 系统权限管理页面的参数
        private const val EXTRA_PERMISSIONS = "motian.permission.extra_permission" // 权限参数
        private const val PACKAGE_URL_SCHEME = "package:" // 方案

        // 启动当前权限页面的公开接口
        fun startActivityForResult(activity: Activity, requestCode: Int, vararg permissions: String) {
            val intent = Intent(activity, PermissionsActivity::class.java)
            intent.putExtra(EXTRA_PERMISSIONS, permissions)
            startActivityForResult(activity, intent, requestCode, null)
        }
    }

}

三:使用方式

class Main2Activity : AppCompatActivity() {
    // 请求码
    private val RESULT_CODE = 0
    // 所需的全部权限
    var permissionListTmp = arrayOf<String>(Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE)
    // 权限检测器
    private var mPermissionsChecker: PermissionsChecker? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main2)
        setSupportActionBar(toolbar)

        mPermissionsChecker = PermissionsChecker(this)
        // 缺少权限时, 进入权限配置页面
        if (mPermissionsChecker!!.lacksPermissions(*permissionListTmp)) {
            startPermissionsActivity()
        }
    }

    private fun startPermissionsActivity() {
        PermissionsActivity.startActivityForResult(this, RESULT_CODE, *permissionListTmp)
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        // 拒绝时, 关闭页面, 缺少主要权限, 无法运行
        if (requestCode == RESULT_CODE && resultCode == PermissionsActivity.PERMISSIONS_DENIED) {
            finish()
        }
    }

}

原文地址:https://www.cnblogs.com/niupi/p/11648026.html

时间: 2024-10-15 02:24:08

使用Kotlin写的Android动态权限检查的相关文章

Android动态权限申请

从Android 6.0开始,权限不再是在manifest文件中粘贴一下即可,这时候权限也正式走进大家的视野.项目的6.0适配就是我做的,当时没有仔细总结,最近在另一个项目添加权限的时候发现,同一个功能都没有添加申请权限的代码,一个会挂一个不会,花了几个小时在这个小问题上.因此多花点时间总结一下权限问题. Android系统权限的概念 Android是一个权限分隔的操作系统,每个应用都有独特的系统标识.一般情况下,应用没有权限执行对其它应用.系统.用户可能有不利影响的操作.每个应用都在应用沙盒中

Android的权限检查

Application的权限: 可以在AndroidManifest.xml中用<permission>定义运行Application需要的权限. 用<uses-permission>定义程序获得的权限,否则执行会抛出异常. 也可以在代码中检查是否有相应的Application权限: public static final String PERMISSION_SAY_HELLO = "com.wanxiang.www.checkpermissionincode.permi

android 6 权限检查 zxing

/*// 新增 private static final int MY_PERMISSIONS_REQUEST_CALL_CAMERA = 1;//请求码,自己定义 // 新增Android6.0 权限检查 @Override protected void onStart() { super.onStart(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (ContextCompat.checkSelfPermission(

Android权限之动态权限

安卓系统的权限管理机制从API 23 (也就是Android 6.0 又叫做 Android M,)之后发生了比较大的改变,在一些比较危险的权限上要求必须申请动态权限,即使你在AndroidMainfest.xml文件中申请也没有任何用,或者你可以将编译的目标版本设定这API 22,这样就可以了.但这并不是长久之计,不是吗?所以因此在这里学习一下. 动态权限需求原因 Android 6.0之前,权限在应用安装过程中只询问一次,以列表的形式展现给用户,然而大多数用户并不会注意到这些,直接就下一步了

Android 6.0 - 动态权限管理的解决方案(转)

转自:http://www.cnblogs.com/dubo-/p/6018262.html Android 6.0 - 动态权限管理的解决方案 转载请标注 Android 6.0版本(Api 23)推出了很多新的特性, 大幅提升了用户体验, 同时也为程序员带来新的负担. 动态权限管理就是这样, 一方面让用户更加容易的控制自己的隐私, 一方面需要重新适配应用权限. 时代总是不断发展, 程序总是以人为本, 让我们为应用添加动态权限管理吧! 这里提供了一个非常不错的解决方案, 提供源码, 项目可以直

Android 6.0 动态权限申请注意事项

<span style="font-size:24px;color:#ffff00;background-color: rgb(0, 0, 153);"><strong>Android 6.0 权限区分</strong></span> Android 6.0 为了保护用户隐私,将一些权限的申请放在了应用运行的时候去申请, 比如以往的开发中,开发人员只需要将需要的权限在清单文件中配置即可,安装后用户可以在设置中的应用信息中看到:XX应用以获

Android 6.0: 动态权限管理的解决方案

欢迎Follow我的GitHub, 关注我的CSDN. Android 6.0版本(Api 23)推出了很多新的特性, 大幅提升了用户体验, 同时也为程序员带来新的负担. 动态权限管理就是这样, 一方面让用户更加容易的控制自己的隐私, 一方面需要重新适配应用权限. 时代总是不断发展, 程序总是以人为本, 让我们为应用添加动态权限管理吧! 这里提供了一个非常不错的解决方案. Android系统包含默认的授权提示框, 但是我们仍需要设置自己的页面. 原因是系统提供的授权框, 会有不再提示的选项. 如

Android动态获取权限

android权限的变化 在Android6.0以前的版本的时候,Android的权限都是在安装的时候全部的配置完成的.然而这往往会造成一些安全的问题. Google的解决办法: 将Android中的权限分为了两大类: Normal:权限不会直接涉及到用户的隐私.如果你的应用在manifest清单文件中配置了此类的权限,那么系统会自动的同意. Dangerous权限能够让应用去访问用户的隐私数据.如果你的应用在manifest中配置了此类的权限,那么久得需要用户同意此类权限. 注意:如果你的应用

Android运行时动态权限获取

运行时动态权限简介 在targetSdkVersion小于23的应用中默认授予AndroidManifest中声明的所有权限,而无需手动授予.当targetSdkVersion在23或以上时,应用默认不会授予"Dangerous"级别的权限,Android默认只要授予该组一个权限即可获得该组的所有权限. 动态权限获取 下面将演示如何通过运行时权限获取来调用系统相机进行拍照和录制视频 首先以targetSdkVersion 23来编译调试应用,要调用相机拍照并存储需要在在AndroidM