我正在制作一个练习音板,我想让用户能够下载声音(我已经包含在res/raw
文件夹中的应用程序中)onClick菜单项但我只能找到有关从互联网网址下载的信息,而不是我已经包含在apk中的信息。
最好的方法是什么?如果可能的话,我想给他们保存到SD卡的选项。在文档中使用正确类的一点是很棒的!我一直在谷歌上搜索无效。
谢谢!
答案 0 :(得分:2)
尝试这样的事情:
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();
}
}
}
答案 1 :(得分:1)
我不知道raw
但我在我的应用中使用assets
文件夹做了类似的事情。我的文件位于assets/backgrounds
文件夹下,您可以从下面的代码中猜到。
您可以修改此代码并使其适用于您(我知道我只有4个文件,这就是我i
从0到4的原因,但您可以将其更改为您想要的任何内容。< / p>
此代码将以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());
}
}
}