从我的res/raw文件夹中下载(复制?)一个文件到默认的Android下载位置?

3
我正在制作一个练习用的声音板,希望用户可以通过点击菜单项下载我在res/raw文件夹中包含的声音,但我只能找到关于从互联网URL下载的信息,而不是已经包含在apk中的内容。
最好的方法是什么?如果可能的话,我想给他们保存到SD卡的选项。如果能指向正确的类来使用文档就好了!我一直在谷歌搜索,但没有结果。
谢谢!

这很简单,刚刚写了一个答案... - undefined
2个回答

5
尝试像这样做:

public void saveResourceToFile() {
InputStream in = null;
FileOutputStream fout = null;
try {
    in = getResources().openRawResource(R.raw.test);
    String downloadsDirectoryPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath();
    String filename = "myfile.mp3"
    fout = new FileOutputStream(new File(downloadsDirectoryPath + "/"+filename));

    final byte data[] = new byte[1024];
    int count;
    while ((count = in.read(data, 0, 1024)) != -1) {
        fout.write(data, 0, count);
    }
} finally {
    if (in != null) {
        in.close();
    }
    if (fout != null) {
        fout.close();
    }
}
}

这看起来就是我需要的东西 - 如果手机上没有SD卡,它会下载到默认的下载文件夹吗?还是getExternalStorageDirectory()只是找到他们在手机上设置的任何存储区域?谢谢! - undefined
是的,它将“下载”到下载文件夹(可能会有所不同),但这只是一个基本示例,您可能还想检查SD卡是否可写等。顺便说一句,在Android开发者网站上有一个完整的代码示例在这里,可能比这个更好。 - undefined

1
我不知道raw是什么,但我在我的应用程序中使用了assets文件夹做了类似的事情。 我的文件在assets/backgrounds文件夹下,您可以从下面的代码中看出来。
您可以修改此代码并使其适用于您(我知道我只有4个文件,这就是为什么我让i从0到4,但您可以将其更改为任何您想要的内容)。
此代码将以prefix_开头的文件(如prefix_1.png,prefix_2.png等)复制到我的缓存目录,但您显然可以更改扩展名,文件名或要保存资产的路径。
public static void copyAssets(final Context context, final String prefix) {
    for (Integer i = 0; i < 4; i++) {
        String filename = prefix + "_" + i.toString() + ".png";
        File f = new File(context.getCacheDir() + "/" + filename);
        if (f.exists()) {
            f.delete();
        }

        if (!f.exists())
            try {
                InputStream is = context.getAssets().open("backgrounds/" + filename);
                int size = is.available();
                byte[] buffer = new byte[size];
                is.read(buffer);
                is.close();

                FileOutputStream fos = new FileOutputStream(f);
                fos.write(buffer);
                fos.close();
            } catch (Exception e) {
                Log.e("Exception occurred while trying to load file from assets.", e.getMessage());
            }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接