android 10文件存储兼容

前言

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

看图

android 10文件存储兼容_第1张图片
如图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后就算兼容完成了。

tips:
针对应用中使用到三方SDk还未进行兼容,采用清单文件添加 android:requestLegacyExternalStorage="true" 属性就可以,等待三方sdk提供方兼容。

集成过程中发现读取系统相册的功能不可用,查阅资料后得知 MediaStore.Images.Media.DATA,这个查阅Image Path的方式不可用。目前采用通过Uri进行显示Image而不是通过Image 路径。如果需要将文件上传至服务端,需要额外处理Uri,将Uri对应的图片通过流的方式读取到其他目录,然后拿到图片路径进行操作如下:

  // 通过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;
    }

下载入口

你可能感兴趣的:(android,基础知识)