首先要在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 所以我们需要在权限被用户禁用一次后,就不再去请求权限
//而是使用弹框提示用户 这样用户来使用该功能的时候,
//我们每次可以给一个提示,让用户自己手动选择开启权限