Android存储权限完美适配(Android11及以上适配)

火影  金牌会员 | 2024-8-30 04:43:34 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 805|帖子 805|积分 2415

一、Bug简述

一个很平凡的需求,必要下载图片到本地,我的三个测试机(荣耀Android10,红米 11 和小米Android 13都没有题目)。
然后,主角登场了,测试的三星Android 13 死活拉不起存储权限弹窗。
想了下,三星的体系可能和小米的体系做了些区别。于是就是看了下存储权限的版本更迭,却是发现了些骚东西。
二、原因

很早从前,一直都是在manifest申明这两个权限就可以了,但是现在会有下面的告诫!
这便是错误的原因:



 可以得知,在Android 13(sdkversion为33)的体系中,已经被废弃了!!!
但是如果你给Write和Read权限加上maxSdkVersion=32,他在11,12上是没有题目的,但是最新的App要求 target sdkversion必须是33了。
所以,在此就必须做一个适配:
Android 11 里将引入一个特别的权限叫做 MANAGE_EXTERNAL_STORAGE,该权限将授权读写全部共享存储内容,这也将同时包罗非媒体类型的文件。但是得到这个权限的应用还是无法访问其他应用的应用专属目录 (app-specific directory),无论是外部存储还是内部存储。
那么,为了兼容Android版本,我就必须在Android11之前和之后分开做申请才会有用。
三、步骤

1).申明权限
manifest文件里:
  
  1. <uses-permission
  2.     android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
  3.     tools:ignore="ScopedStorage" />
复制代码
2).权限的判断
判断是否已经得到权限:
  1. private fun checkPer(activity: PreViewActivity): Boolean {
  2.         return if (Build.VERSION.SDK_INT >= 30) {
  3.             EasyPermissions.hasPermissions(
  4.                 activity,
  5.                 android.Manifest.permission.MANAGE_EXTERNAL_STORAGE
  6.             )
  7.         } else {
  8.             EasyPermissions.hasPermissions(
  9.                 activity,
  10.                 android.Manifest.permission.WRITE_EXTERNAL_STORAGE
  11.             )
  12.         }
  13.     }
复制代码
未得到权限,申请权限
  1. private fun aaa(activity: PreViewActivity, curImg: Int) {
  2.         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
  3.             
  4.                 val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)
  5.                 intent.data = Uri.parse("package:" + activity.packageName)
  6.                 activity.startActivityForResult(intent, 200)
  7.            
  8.         } else {
  9.             val perm = android.Manifest.permission.WRITE_EXTERNAL_STORAGE
  10.             PaperThreeVariable.isToRequestPer = true
  11.             EasyPermissions.requestPermissions(
  12.                 PermissionRequest.Builder(
  13.                     activity,
  14.                     200,
  15.                     perm
  16.                 )
  17.                     .build()
  18.             )
  19.         }
  20.     }
复制代码
权限申请回调
  1.     override fun onRequestPermissionsResult(
  2.         requestCode: Int, permissions: Array<String>, grantResults: IntArray
  3.     ) {
  4.         super.onRequestPermissionsResult(requestCode, permissions, grantResults)
  5.         EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
  6.     }
  7.     override fun onPermissionsGranted(requestCode: Int, perms: MutableList<String>) {
  8.         AppInitUtils().saveFreshAppImageToGallery(this, curImg)
  9.         PaperThreeVariable.isToRequestPer = false
  10.     }
  11.     override fun onPermissionsDenied(requestCode: Int, perms: MutableList<String>) {
  12.         PaperThreeVariable.isToRequestPer = false
  13.         if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
  14.             AppSettingsDialog.Builder(this)
  15.                 .setRationale("This function requires storage permission to be enabled")
  16.                 .setNegativeButton("No")
  17.                 .setPositiveButton("Yes")
  18.                 .build().show()
  19.         }
  20.     }
复制代码
因为偶然候用户会拒绝权限且永世弹窗,所以为了方便我就用了EasyPermission这个库,拒绝的情况下,弹窗跳转体系权限设置页面去让用户选择开启权限。

这样,就OK啦!(至于我的小米为啥Android 13也能正常拉起,我也不知道具体原因,但是在Android Studio的历史链接装备中,我发现它辨认我的手机体系为Android 12,真是百思不得其解)
本文参考了郭霖大神的一篇文章,当时是想看下 Scoped Storage这个属性的内容,接过发现了Android 11的变更。
Android 11新特性,Scoped Storage又有了新花样
仅做个人工作总结,内容肯定不够全面,如有题目,欢迎大佬指正!
Android Permission 权限申请,EasyPermission和其他三方库_安卓权限申请_&岁月不待人&的博客-CSDN博客
补充:
因为 MANAGE_EXTERNAL_STORAGE,该权限将授权读写全部共享存储内容,所以在谷歌中属于敏感权限,不容易通过,如果只是想生存图片,则可以通过下面的博客中的方法去生存
Android 生存图片并刷新相册(无需权限)-CSDN博客
Android Gilde获取网络图片显示生存路径并转化为bitmap-CSDN博客

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

火影

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表