1、遇到的问题?
我在开发过程中遇到,动态申请存储权限,没有申请开启存储权限提示框,直接提示拒绝权限,进入权限设置页面。我采用了网上比较流行的权限申请框架都是如此。我用的权限申请框架是:
// 权限管理
implementation 'com.github.dfqin:grantor:2.5'
//EasyPermissions权限管理框架
implementation 'pub.devrel:easypermissions:3.0.0'
XML已经加入了:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>



注意:在所有权限列表,根本找不到存储权限。
2、解决方式1:
解决:将compileSdkVersion 和targetSdk 版本改成31即可(出问题的版本是33)。
android {
//namespace 'com.asura.android.tmspda'
compileSdkVersion 31
buildToolsVersion "30.0.3"
defaultConfig {
applicationId "com.asura.android.tmspda"
minSdk 21
targetSdk 31
versionCode 100
versionName "1.0.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
multiDexEnabled true
ndk {
// 设置支持的SO库架构
abiFilters 'armeabi', 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a'
}
}
}

3、解决方式2:
注意:Android 13(API 33)读写SD卡权限的调整适配:
在Android13前读取SDcard 的内容只需要一个权限:
android.permission.READ_EXTERNAL_STORAGE
但是在Android 13以后这个权限被细化成了三个:
public static final String READ_MEDIA_AUDIO = "android.permission.READ_MEDIA_AUDIO";
public static final String READ_MEDIA_IMAGES = "android.permission.READ_MEDIA_IMAGES";
public static final String READ_MEDIA_VIDEO = "android.permission.READ_MEDIA_VIDEO";
如果是升级Android13之前就已经具有读写SDK的权限,那么升级到13之后,自己具有上述三个权限。
1、如果是升级Android13之后新装的应用,并且targetSDK小于33,则申请READ_EXTERNAL_STORAGE权限时,会自动转化为对上述三个权限的申请,权限申请框只一个。
2、如果是升级Android13之后新装的应用,并且targetSDK大于等于33,则申请READ_EXTERNAL_STORAGE权限时会自动拒绝(同理WRITE_EXTERNAL_STORAGE也是一样)。必须申请上面三个权限才可以。
使用:
1、xml中添加:
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
2、代码中申请:
fun requestStorage() {
//一定要进行版本判断,还是找不到存储权限
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU){
LogUtils.debugInfo("----大于33的版本-----")
PermissionsUtil.requestPermission(
this,
object : PermissionListener {
override fun permissionGranted(permission: Array<out String>) {
//升级弹窗
// CommonDialogUtil.commonAppUpdate(this@SplashActivity)
//进入登录页或者主页面
startActivity(Intent(this@SplashActivity, HomeActivity::class.java))
finish()
}
override fun permissionDenied(permission: Array<out String>) {
LogUtils.debugInfo("---报错:${permission.toString()}")
ToastUtils.showToast(this@SplashActivity, "用户拒绝了存储权限")
PermissionsUtil.gotoSetting(this@SplashActivity)
}
},
Manifest.permission.READ_MEDIA_AUDIO,
Manifest.permission.READ_MEDIA_IMAGES,
Manifest.permission.READ_MEDIA_AUDIO,
)
}else {
LogUtils.debugInfo("----小于33的版本-----")
PermissionsUtil.requestPermission(
this,
object : PermissionListener {
override fun permissionGranted(permission: Array<out String>) {
//获得权限,操作内容....
}
override fun permissionDenied(permission: Array<out String>) {
ToastUtils.showToast(this@SplashActivity, "用户拒绝了存储权限")
PermissionsUtil.gotoSetting(this@SplashActivity)
}
},
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
)
}
}
网友评论