首页 > 解决方案 > 如何执行多个文件复制到共享集合下载,适用于 Android Q,范围存储?

问题描述

对于即将推出的Android Q Scoped Storage,我想知道我们如何执行文件从和到的复制?


在 Android Q 之前

我有几个图像文件,它们位于以下位置

Application.instance().getExternalFilesDir(null) + "/a.png";
Application.instance().getExternalFilesDir(null) + "/b.png";
Application.instance().getExternalFilesDir(null) + "/c.png";

为确保即使卸载应用程序仍保留这些文件,应用程序会将图像文件复制到以下位置

Environment.getExternalStorageDirectory() + "/com.yocto.wenote/backup/a.png";
Environment.getExternalStorageDirectory() + "/com.yocto.wenote/backup/b.png";
Environment.getExternalStorageDirectory() + "/com.yocto.wenote/backup/c.png";

一个简单的java.io.File复制操作就可以做到这一点。

public static boolean copy(File src, File dst) {

    InputStream in = null;
    OutputStream out = null;
    try {
        in = new FileInputStream(src);
        out = new FileOutputStream(dst);

        // Transfer bytes from in to out
        byte[] buf = new byte[1024];
        int len;
        while ((len = in.read(buf)) > 0) {
            out.write(buf, 0, len);
        }

        return true;
    } catch (IOException e) {
        Log.e(TAG, "", e);
    } finally {
        close(out);
        close(in);
    }

    return false;
}

对于 Android Q,范围存储

java.io.File在 Android Q、Scoped Storage 下不再可用。

根据https://developer.android.com/preview/privacy/scoped-storage

如果您的应用程序创建了属于用户的文件,并且用户希望在卸载您的应用程序时保留这些文件,则将它们保存到一种常见的媒体集合中,也称为共享集合。共享收藏包括:照片和视频、音乐和下载。

我们希望将 3 个图像文件复制到共享集合下载。但是,我们很难得到一个具体的代码示例,如何实现呢?


我们如何执行多个文件复制到共享集合下载,对于 Android Q,范围存储?

标签: android

解决方案


称呼Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).mkdirs()

File现在,您可以使用标准API读取和写入仅限于您的应用程序文件的下载文件夹的沙盒视图。如果您打开默认文件应用程序并导航到下载,您将看到所有应用程序的所有下载,包括您的应用程序。(至少在模拟器上)


推荐阅读