关于Android Q 的文件分区存储权限适配研究

我们发现每安装一个应用,你的手机文件管理中就会创建很多文件夹,而且应用卸载文件夹还在,里面的文件也在,手机用着用着文件系统越来越庞大,最后就是卡顿。
在Android 10 新特性中有一个保护外部存储设备中的用户数据,应用可以将自己的文件存储在专用沙盒中,另外就是可以访问公共文件夹,比如Download、DCIM、Music等,这样就不会在/storage/emulated/0/下面创建很多文件夹,你也不能随便访问别的应用文件夹。

  • Android 10
    虽然加入了此特性,但是Google肯定会考虑给开发者过渡期,Android 10 可以通过在manifest.xmlapplication标签下配置android:requestLegacyExternalStorage="true"来继续使用以前的存储方式,这只是一个临时解决方式,适配还是少不了的。
  • Android 11
    此后就要强制使用,即使添加android:requestLegacyExternalStorage="true",系统也会忽略的,官方文档有明确说明。
    在这里插入图片描述

1、官方提供访问应用自己的目录方法
在这里插入图片描述

	/**
     * 获取本应用下的文件存储路径
     * 可直接写入文件
     *
     * @param context
     * @param type
     * @return /storage/emulated/0/Android/data/{@package}/files/{@type}
     */
    public static String getExternalFilesDir(Context context, String type) {
        File apk = null;
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
            apk = context.getExternalFilesDir(type);
        return apk == null ? "" : apk.getAbsolutePath();
    }

就是在文件管理中的 Android/data/ 目录下根据包名给应用创建各自的文件存储区,你可以在这个目录下存储文件,创建子目录(即type)。

2、获取公共区目录(Downloads、Documents、Pictures 、DCIM、Movies、Music、Ringtones),需要文件读写权限,除了这些目录外的都无法访问了。

	/**
     * 获取公共目录
     * 不能直接读/写文件,需要获取读写权限才能操作
     *
     * @param type Downloads、Documents、Pictures 、DCIM、Movies、Music、Ringtones
     * @param createDir 在type公共目录下创建新文件夹
     * @return
     */
    public static String getExternalStoragePublicDir(String type, String createDir) {
        File directory = null;
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
            directory = Environment.getExternalStoragePublicDirectory(type);
        String path = directory == null ? "" : directory.getAbsolutePath();
        if (!TextUtils.isEmpty(createDir)) {
            path += File.separator + createDir;
            File file = new File(path);
            if (!file.exists()) file.mkdir();
            file = null;
        }
        return path;
    }

经测试,结果如下:

  • 小米10X Android10,不用开启requestLegacyExternalStorage,可以用以前的方式正常存储文件
  • 华为荣耀 Android10,需要开启requestLegacyExternalStorage,才可以用以前的方式存储文件,否则在存储文件的时候抛出FileNotFoundException异常。
  • 其他手机暂时没测试过。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值