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


    感觉很久没有写博客了,不对,的确是很久没有写博客了。原因我不怎么想说,玩物丧志了。后面渐渐要恢复之前的写作节奏。今天来聊聊我最近遇到的一个问题:

    Android 13版本对于storage权限的控制问题。

    我们都知道,Android的每个版本更新都会伴随着搞事,也就是所谓的谷歌精英又会劝告我们来按照他们认为高效,他们认为优雅的方式来写代码,或者实现某些功能。所以在Android 13版本中,他们就对我们非常常用的storage权限伸出魔爪了。

    我现在主要是开发面向海外的用户的2C应用,所以,不像国内一样,对于版本的需求可以说是非常严苛,然后这次谷歌就下了最后通牒,说如果应用不把Target SDK Version设置成33,我们就不和你玩啦= =

    然后就在Storage权限这里出问题了。Android 13版本需要将storage权限细分为

    • 对图片的访问权限

    • 对视频的访问权限

    • 对音频的访问权限

    但是我们项目是混编的项目,目前主要的代码都是用Flutter代码来实现了,这样就出现了一些比较尴尬的问题。

    场景是这样的,在Flutter层我们希望从本地选取图片文件,在之前的版本(Android13)中,在选取文件前我们就需要判断本地存储权限的获取状况,然后根据权限的状态来确定进一步操作,比如说弹出权限请求框或者直接让用户选择本地图片。

    但是在Android13及之后的版本中,对于Storage权限的请求分为三种(其实我就感觉是谷歌官方闲着没事干,来宣誓一下自己的主权):

    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之前版本的请求权限的方式时,即直接请求WRITE_EXTERNAL_STORAGE权限,那么系统就会直接返回用户已经拒绝了该权限,无论用户是否曾经拒绝过该权限。

    那么问题来了,如果是你,你会怎么解决这个问题:

    Flutter中star比较高的解决方案是:permission_handler。它的解决思路是在Flutter层也增加如上三种权限,在需要请求的时候进行区分,这样的确可以,但是存在一个麻烦的地方。就是每次调用的时候都需要对平台进行区分,这就很恶心了。

    所以在这里我并不打算对Flutter层进行修改,而是在原生层进行改动,我不会贴具体的代码,我只提供思路,因为代码是死的,人是活的。

    解决这个问题我们只需要在请求storage权限的时候进行当前手机Android版本的判断,如果当前手机的版本大于Android 13,那么就同时请求上述三种权限,然后将请求结果包装成正常的storage请求结果即可。

  • 相关阅读:
    C++右值引用是一个左值引发的思考
    数字化审计智慧
    MySQL 特殊字符
    SpringCloud之Ribbon负载均衡解读
    怎样将Vue+SpringBoot项目发布到阿里云服务器
    Spring学习记录
    redis系列之——高可用(主从、哨兵)
    如何在 Linux 服务器上配置基于 SSH 密钥的身份验证
    Hadoop环境安装与配置
    Solidity - 合约结构 - 错误(error)- ^0.8.4版本新增
  • 原文地址:https://blog.csdn.net/qq_31433709/article/details/133045110