美文网首页
JetPack<第三篇>:PermissionX

JetPack<第三篇>:PermissionX

作者: NoBugException | 来源:发表于2022-08-08 09:27 被阅读0次

    【1】github地址

    https://github.com/guolindev/PermissionX
    

    【2】添加依赖

    implementation 'com.guolindev.permissionx:permissionx:1.6.4'
    

    【3】声明权限

    在 AndroidManifest.xml 中声明权限:
    
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
    

    【4】请求权限代码

    // 获取权限
    PermissionX.init(this@DataActivity)
    .permissions(Manifest.permission.READ_CONTACTS, Manifest.permission.CAMERA, Manifest.permission.CALL_PHONE)
    .request { allGranted, grantedList, deniedList ->
        if (allGranted) {
            Toast.makeText(this, "All permissions are granted", Toast.LENGTH_LONG).show()
        } else {
            Toast.makeText(this, "These permissions are denied: $deniedList", Toast.LENGTH_LONG).show()
        }
    }
    
    allGranted:是否所有权限都授予
    grantedList:已被授予权限的列表
    deniedList:未被授予权限的列表
    

    【4】解释必须请求的原因

    使用 PermissionX 的 onExplainRequestReason 方法,向用户解释为什么要请求这些权限,或者向用户体现权限的重要性。
    
    
    // 获取权限
    PermissionX.init(this@DataActivity)
    .permissions(Manifest.permission.READ_CONTACTS, Manifest.permission.CAMERA, Manifest.permission.CALL_PHONE)
    .onExplainRequestReason { scope, deniedList ->
        var permissions : String = ""
        for (permission : String in deniedList) {
            when(permission) {
                Manifest.permission.READ_CONTACTS -> permissions += if (permissions.isEmpty()) "联系人权限" else "、联系人权限"
                Manifest.permission.CAMERA -> permissions += if (permissions.isEmpty()) "相机权限" else "、相机权限"
                Manifest.permission.CALL_PHONE -> permissions += if (permissions.isEmpty()) "电话权限权限" else "、电话权限"
                else -> permissions
            }
        }
        scope.showRequestReasonDialog(deniedList,
            "请再次确认是否需要 $permissions。\n如果不需要,部分功能无法使用。", "确认", "取消")
    }
    .request { allGranted, grantedList, deniedList ->
        if (allGranted) {
            Toast.makeText(this, "All permissions are granted", Toast.LENGTH_LONG).show()
        } else {
            Toast.makeText(this, "These permissions are denied: $deniedList", Toast.LENGTH_LONG).show()
        }
    }
    
    当用户拒绝权限请求后,会弹出解释性请求对话框:
    
    image.png
    该对话框默认是在请求权限之后执行,如果想要在请求权限之前执行,则需要使用:
    
    .explainReasonBeforeRequest()
    

    【5】打开设置,手动打开权限

    .onForwardToSettings { scope, deniedList ->
        scope.showForwardToSettingsDialog(deniedList, "打开设置页面,手动打开权限", "OK", "Cancel")
    }
    
    使用 onForwardToSettings  方法,当检测到权限被拒时,弹出对话框,
    让用户选择是否打开设置页面,让用户手动打开对应的权限。
    

    【6】检查是否有某权限

        if (ContextCompat.checkSelfPermission(this@DataActivity, Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {
    
        } else {
            ActivityCompat.requestPermissions(this@DataActivity, arrayOf(Manifest.permission.CALL_PHONE), 1)
        }
    

    【7】有关对话框

    onExplainRequestReason 和 onForwardToSettings 是 PermissionX 自带的两种对话框,并且支持深色主题。
    但是,这两种对话框样式比较单一,如果有必要,不要使用 onExplainRequestReason 和 onForwardToSettings,
    在实际项目中,我们更多的是自定义对话框。
    

    【8】RxPermission

    除了 PermissionX 之外,RxPermission也是一个不错的选择。

    Rx系列<第二十九篇>:RxPermission - 简书 (jianshu.com)

    RxPermission 用法 - 简书 (jianshu.com)

    [本章完...]

    相关文章

      网友评论

          本文标题:JetPack<第三篇>:PermissionX

          本文链接:https://www.haomeiwen.com/subject/mzcwwrtx.html