android 授权简单使用

首先要在AndroidManifest.xml 加入权限 这里以存储权限和相机权限 来演示

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.test.app">
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.CAMERA" />
    .....
</manifest>

可以先检查是否有权限

val permission =
ActivityCompat.checkSelfPermission(
    context,
    Manifest.permission.WRITE_EXTERNAL_STORAGE
) == PackageManager.PERMISSION_GRANTED
​
val cameraPermission =
ActivityCompat.checkSelfPermission(
    context,
    Manifest.permission.CAMERA
) == PackageManager.PERMISSION_GRANTED
​
​
if (permission && cameraPermission) {
    //有权限了
    val file = File("路径")
    if (!file.exists() || !file.isDirectory) {
        try {
            //创建好文件夹 为后面操作文件做准备
            file.mkdirs()
        } catch (e: IOException) {
​
        }
    }
}else{
    //这里调用授权请求
}

授权请求

try {
    ActivityCompat.requestPermissions(
        activity,//fragment 中使用 requireActivity()  activity 中使用this即可
        arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE
                ,Manifest.permission.CAMERA
               ),
        1 //requestCode  自己随便定义一个数字即可  在回调的时候知道就行
    )
} catch (e: Exception) {
    //防止出问题 不catch的话 部分情况下会闪退 (禁用权限后,再次请求的话会闪退,使用模拟器和荣耀10测试,其他机型不清楚)
}

接下来是授权请求回调 (frgament 和 activity回调函数一样)

override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if (requestCode == 1) {
            val result = grantResults[0] == PackageManager.PERMISSION_GRANTED
            val result2 = grantResults[1] == PackageManager.PERMISSION_GRANTED
            if (result && result2) {
                //授权成功
            }else{
                Toast.makeText(context, "您取消了授权,如果您想要授权的话请到 设置-应用 找到"测试"应用手动授予相应权限", Toast.LENGTH_SHORT).show()
            }
        }
    }

判断权限是否被拒绝过

val has = ActivityCompat.shouldShowRequestPermissionRationale(activity, permission)
//首次安装app   未授权 has = false 这里就有点坑爹了,没有授权需要去授权返回false很蒙蔽了
//拒绝后       has = true
//授权后       has = false   这里授权后不需要授权正常
//拒绝后不在提示 has = false   这里不能授权也正常
//感觉shouldShowRequestPermissionRationale好像没啥用处,纯粹出来打酱油的
//我们下面的分析 因为首次未授权返回false 所在在为false的情况下我们请求授权,一旦用户拒绝后返回true 此时情况下
//我们不在让用户去授权,就是不在让用户有看见拒绝后不在提示的选项 ,而是直接让用户跳转到app详细设置页,手动去授权

//has为true的情况下 不要在去请求权限了,可以使用弹框提示用户自己去设置开启权限
//否则再次弹出的话,会出现禁止后不再提示 当用户点击禁止后不再提示 就不会弹出请求框了
//再次判断是否拒绝过 会返回true 所以我们需要在权限被用户禁用一次后,就不再去请求权限
//而是使用弹框提示用户 这样用户来使用该功能的时候,
//我们每次可以给一个提示,让用户自己手动选择开启权限

 

原文地址:https://www.cnblogs.com/rchao/p/14072046.html