天天看点

android 10文件存储兼容

前言

Android Q 推送已经一段时间,手上几部测试机也已经升级到android 10 系统。google 对用户隐私是越来越上心了。简单介绍下适配10系统分区存储。

看图

android 10文件存储兼容

如图10系统兼容脑图。包括兼容方案,延时兼容处理,兼容完成如何查验是否兼容成功。

为什么需要兼容10系统?

gogle 官网罗列的一大串兼容10的好处。比较重要的一点是为了保护用户隐私使用类似应用沙箱原理。自己的app只可以访问自己的存储资料。

2.避免app已经卸载了,留下来一个几十MB 或者几百MB的无用文件夹,采用新的文件存储方案,在app卸载同时一并卸载关联的文件夹及文件

3.如何只访问自己的存储不去访问其他app或者公共系统资源,那么就不用去申请SDcard的读写权限。

4.一切为了安全!!!

如果不想立即适配android 10 分区存取新特性,怎么办?

只需要在Mainifest–application下添加如下属性即可

android:requestLegacyExternalStorage="true"      

想了解适配步骤,知其然知其所以然,请移步 ​​android Studio 官网​​ 这里简单写下自己兼容步骤

1.全局替换所有老版本获取SdCard 路径的api为新版 api 方式.

#### 老版本  android Q 以下
   public String SDCARD_DIR = Environment.getExternalStorageDirectory().getAbsolutePath();
   
    #### 新版本  android Q 以上
    public String SDCARD_DIR = ContextCompat.getExternalFilesDirs(
    FrameApplication.instance(), null)[0].getAbsolutePath();      

替换api后就算兼容完成了。

// 通过Uri查找图片名称,然后输出图片到Sd卡指定位置,将图片路径返回
    private String getPathByUri(Uri uri) {
        ContentResolver resolver = this.getContentResolver();
        String fileName = String.valueOf(System.currentTimeMillis());
        Cursor cursor = resolver.query(uri, null, null, null, null);
        if (cursor != null && cursor.getCount() > 0) {
            cursor.moveToFirst();
            fileName = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DISPLAY_NAME));
            cursor.close();
        }

        String path = CopyUriToSd.Companion.getInstance().copyUriToExternalFilesDir(this, uri, fileName);

        return path;
    }      

​​下载入口​​