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