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

这篇具有很好参考价值的文章主要介绍了Android存储权限完美适配(Android11及以上适配)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、Bug简述

一个很普通的需求,需要下载图片到本地,我的三个测试机(荣耀Android10,红米 11 和小米Android 13都没有问题)。

然后,主角登场了,测试的三星Android 13 死活拉不起存储权限弹窗。

想了下,三星的系统可能和小米的系统做了些区别。于是就是看了下存储权限的版本更迭,却是发现了些骚东西。

二、原因

很早以前,一直都是在manifest申明这两个权限就可以了,但是现在会有下面的警告!

这便是错误的原因:

适配android11,Android开发Bug日志,android

适配android11,Android开发Bug日志,android

适配android11,Android开发Bug日志,android

适配android11,Android开发Bug日志,android 可以得知,在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文件里:

<uses-permission
    android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
    tools:ignore="ScopedStorage" />

2).权限的判断

判断是否已经获得权限:

 private fun checkPer(activity: PreViewActivity): Boolean {
        return if (Build.VERSION.SDK_INT >= 30) {
            EasyPermissions.hasPermissions(
                activity,
                android.Manifest.permission.MANAGE_EXTERNAL_STORAGE
            )
        } else {
            EasyPermissions.hasPermissions(
                activity,
                android.Manifest.permission.WRITE_EXTERNAL_STORAGE
            )
        }
    }

未获得权限,申请权限

private fun aaa(activity: PreViewActivity, curImg: Int) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            
                val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)
                intent.data = Uri.parse("package:" + activity.packageName)
                activity.startActivityForResult(intent, 200)
           
        } else {
            val perm = android.Manifest.permission.WRITE_EXTERNAL_STORAGE
            PaperThreeVariable.isToRequestPer = true
            EasyPermissions.requestPermissions(
                PermissionRequest.Builder(
                    activity,
                    200,
                    perm
                )
                    .build()
            )
        }
    }

权限申请回调

    override fun onRequestPermissionsResult(
        requestCode: Int, permissions: Array<String>, grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
    }

    override fun onPermissionsGranted(requestCode: Int, perms: MutableList<String>) {
        AppInitUtils().saveFreshAppImageToGallery(this, curImg)
        PaperThreeVariable.isToRequestPer = false
    }

    override fun onPermissionsDenied(requestCode: Int, perms: MutableList<String>) {
        PaperThreeVariable.isToRequestPer = false
        if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
            AppSettingsDialog.Builder(this)
                .setRationale("This function requires storage permission to be enabled")
                .setNegativeButton("No")
                .setPositiveButton("Yes")
                .build().show()
        }
    }

因为有时候用户会拒绝权限且永久弹窗,所以为了方便我就用了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博客文章来源地址https://www.toymoban.com/news/detail-740604.html

到了这里,关于Android存储权限完美适配(Android11及以上适配)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Flutter层对于Android 13存储权限的适配问题

    感觉很久没有写博客了,不对,的确是很久没有写博客了。原因我不怎么想说,玩物丧志了。后面渐渐要恢复之前的写作节奏。今天来聊聊我最近遇到的一个问题: Android 13版本对于storage权限的控制问题。 我们都知道,Android的每个版本更新都会伴随着搞事,也就是所谓的谷

    2024年02月07日
    浏览(30)
  • Android 10-11适配外部存储方案

    Android Api 29 对文件和文件夹进行了重大更改。不允许使用外部存储,如下方法: Environment.getExternalStorageDirectory() = /mnt/sdcard   Environment.getExternalStoragePublicDirectory(“test”) = /mnt/sdcard/test 只能使用内部存储 getExternalFilesDir(“test”) = /mnt/sdcard/Android/data/com.my.app/files/test getExternalF

    2024年02月06日
    浏览(30)
  • 【Android】app应用内版本更新升级(DownloadManager下载,适配Android6.0以上所有版本)

    版本的升级和更新是一个线上App所必备的功能,App的升级安装包主要通过 应用商店 或者 应用内下载 两种方式获得,大部分app这两种方式都会具备,应用商店只需要上传对应平台审核通过即可,而应用内更新一般是通过以下几种方式: 1.集成第三方库如 appupdateX、bugly 的更新

    2024年02月11日
    浏览(65)
  • Android打开系统文件管理器,并获取选中文件的路径,适配Android10及以上无法获取路径

    1.进入文件管理器 2.在onActivityResult中获取返回结果 3.FileHelper完整工具类

    2024年02月02日
    浏览(46)
  • Android实现App内自动升级,适配了安卓7、8及以上版本

            应用发布后,要实现灰度升级控制,如果只依赖各家应用市场是不够的,还需要自己在应用中控制升级逻辑。并且每家应用市场上新审核也是一件很麻烦的事情,尤其像至简网格这样的应用,甚至没在应用市场上架,更不可能依赖它们了。所以必须要在应用中实现自

    2024年02月10日
    浏览(48)
  • Android 10以上出现的 android Permission denied 读写权限问题解决方法

    原因: 从Android 10 开始,应用即使申请了权限,也只能读写自己外部存储的私有目录,就是Android/data/对应应用包名 下的相关目目录。除此之外任何目录的读写都会被拒绝,并提示 android Permission denied。 解决方案 在 AndroidManifest.xml 文件中,在application标签中添加如下属性 and

    2024年02月03日
    浏览(36)
  • Android9.0及以上版本,开启Http的访问权限

    前言: 在android 9.0及以上版本中,cleartextTrafficPermitted默认设置为false阻止了从应用程序发送的任何http请求,官方说明:行为变更:以 API 级别 28 及更高级别为目标的应用  |  Android 开发者  |  Android Developers 1.在res新增xml文件:network_security_config.xml,内容如下: 全部: 过滤:

    2024年02月13日
    浏览(34)
  • android 11及以上保存图片视频到相册

    Android 10之前版本主要步骤 请求读写权限 图片/视频下载到/storage/emulated/0/Android/data/包名/xxx 复制到系统相册目录下 扫描媒体库 Android 10及以上版本主要步骤 请求读写权限 图片/视频下载到/storage/emulated/0/Android/data/包名/xxx 创建ContentValues,写入要保存的信息 调用ContentResolver插入

    2024年02月11日
    浏览(31)
  • 【Android 10 适配】隐私权限变更

    更详细内容请参考 Android 10 中的隐私权变更 Android 10(API 级别 29)引入了多项功能和行为变更,旨在更好地保护用户的隐私。这些变更让用户更清楚地了解并更好地控制自己的数据及为应用提供的权能。 下面是 Android 10 中与 隐私权限 相关的主要变更。 默认情况下,以 Andr

    2024年01月22日
    浏览(47)
  • Android12中蓝牙权限适配

    AndroidManifest.xml 代码 说明: 必须按照这两步申请蓝牙权限, 首先 在androidManifest.xml中配置蓝牙权限,Android11及以下android.permission.BLUETOOTH、android.permission.BLUETOOTH_ADMIN申请这两个,Android12中蓝牙权限进行新增android.permission.BLUETOOTH_SCAN、android.permission.BLUETOOTH_ADVERTISE、android.permi

    2024年02月11日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包