Android开发学习-应用权限管理。

118 阅读2分钟

以拍照功能为例

image.png

添加权限代码

首先在该位置添加以下代码。

<!-- 前后摄像头 -->
<uses-feature android:name="android.hardware.camera.any" />
<!-- 后摄像头 -->
<uses-permission android:name="android.permission.CAMERA"/>

引入权限管理插件

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

然后:Sync Now

新建一个权限管理文件。

image.png

吧以下代码复制进去。使用方式在最下方。

代码

import android.content.pm.PackageManager
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import com.permissionx.guolindev.PermissionX
import com.permissionx.guolindev.dialog.RationaleDialog

/**
 *校验权限是否授权
 * @param permission 需要校验的权限
 * @return true 已授权,false未授权
 *
 * */
fun FragmentActivity.checkPermissionExt(permission: String): Boolean {

    return ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED

}

/**
 *activity中请求权限封装
 * @param permissions 权限组
 * @param allGranted 权限是否授权回调, true授权,false 未授权
 * explainReasonBeforeRequest
 * */
fun FragmentActivity.requestPermissionExt(
    vararg permissions: String,
    allGranted: (Boolean) -> Unit
) {
    PermissionX.init(this).permissions(permissions.toList()).request { isGranted, _, _ ->
        allGranted(isGranted)
    }
}


/**
 *activity中请求权限封装
 * @param permissions 权限组
 * @param allGranted 权限是否授权回调, true授权,false 未授权
 * */
fun FragmentActivity.requestPermissionExt(
    permissions: List<String>,
    allGranted: (Boolean) -> Unit
) {
    PermissionX.init(this).permissions(permissions).request { isGranted, _, _ ->
        allGranted(isGranted)
    }
}


/**
 *activity中请求权限封装
 * @param permissions 权限组
 * @param allGranted 权限是否授权回调, true授权,false 未授权
 *@param forwardToSettings 跳转设置
 * */
fun FragmentActivity.requestPermissionExt(
    permissions: List<String>,
    allGranted: (Boolean) -> Unit,
    forwardToSettings: () -> Unit
) {
    PermissionX.init(this).permissions(permissions).onForwardToSettings { _, _ ->

        forwardToSettings()

    }.request { isGranted, _, _ ->
        allGranted(isGranted)
    }
}

/**
 *activity中请求权限封装
 * @param permissions 权限组
 * @param allGranted 权限是否授权回调, true授权,false 未授权
 * @param explainReasonBeforeRequest 是否在申请权限前弹出说明框 true弹出,false不弹出
 * @param dialog 授权说明弹框
 * @param forwardToSettingsDialog 跳转设置弹框
 * */
fun FragmentActivity.requestPermissionExt(
    vararg permissions: String,
    explainReasonBeforeRequest: Boolean,
    dialog: RationaleDialog,
    forwardToSettingsDialog: RationaleDialog,
    allGranted: (Boolean) -> Unit
) {
    val permissionX = PermissionX.init(this).permissions(permissions.toList())
    permissionX.explainReasonBeforeRequest = explainReasonBeforeRequest

    permissionX.onExplainRequestReason { scope, _ ->
        scope.showRequestReasonDialog(dialog)
    }

    permissionX.onForwardToSettings { scope, _ ->
        scope.showForwardToSettingsDialog(forwardToSettingsDialog)
    }
    permissionX.request { isGranted, _, _ ->
        allGranted(isGranted)
    }
}

/**
 *校验权限是否授权
 * @param permission 需要校验的权限
 * @return true 已授权,false未授权
 *
 * */
fun Fragment.checkPermissionExt(permission: String): Boolean {

    return ContextCompat.checkSelfPermission(
        requireContext(),
        permission
    ) == PackageManager.PERMISSION_GRANTED

}



/**
 *fragment中请求权限封装
 * @param permissions 权限组
 * @param allGranted 权限是否授权回调, true授权,false 未授权
 * explainReasonBeforeRequest
 * */
fun Fragment.requestPermissionExt(
    vararg permissions: String,
    allGranted: (Boolean) -> Unit
) {
    PermissionX.init(this).permissions(permissions.toList()).explainReasonBeforeRequest()
        .request { isGranted, _, _ ->
            allGranted(isGranted)
        }
}


/**
 *fragment中请求权限封装
 * @param permissions 权限组
 * @param allGranted 权限是否授权回调, true授权,false 未授权
 * explainReasonBeforeRequest
 * */
fun Fragment.requestPermissionExt(
    permissions: List<String>,
    allGranted: (Boolean) -> Unit
) {
    PermissionX.init(this).permissions(permissions).explainReasonBeforeRequest()
        .request { isGranted, _, _ ->
            allGranted(isGranted)
        }
}


/**
 *activity中请求权限封装
 * @param permissions 权限组
 * @param allGranted 权限是否授权回调, true授权,false 未授权
 * @param explainReasonBeforeRequest 是否在申请权限前弹出说明框 true弹出,false不弹出
 * @param dialog 授权说明弹框
 * @param forwardToSettingsDialog 跳转设置弹框
 * */
fun Fragment.requestPermissionExt(
    vararg permissions: String,
    explainReasonBeforeRequest: Boolean,
    dialog: RationaleDialog,
    forwardToSettingsDialog: RationaleDialog,
    allGranted: (Boolean) -> Unit
) {
    val permissionX = PermissionX.init(this).permissions(permissions.toList())
    permissionX.explainReasonBeforeRequest = explainReasonBeforeRequest

    permissionX.onExplainRequestReason { scope, _ ->
        scope.showRequestReasonDialog(dialog)
    }

    permissionX.onForwardToSettings { scope, _ ->
        scope.showForwardToSettingsDialog(forwardToSettingsDialog)
    }
    permissionX.request { isGranted, _, _ ->
        allGranted(isGranted)
    }
}

代码使用方式

requestPermissionExt(
    Manifest.permission.CAMERA,
){ it ->
    if (it) {
        //授权成功,或者已授权
    } else {
        Toast.makeText(context,
            "Permissions not granted by the user.",
            Toast.LENGTH_SHORT).show()

    }
}

匆忙之前只学了下怎么获取权限,关于安卓权限管理的一些机制,后续再补充。