我正在做一个共鸣板练习,我想给予用户能够下载声音(我已经包括在应用程序中的res/raw文件夹)onClick的菜单项,但我只能找到有关从互联网URL下载的信息,而不是我已经包括在APK中的东西。什么是最好的方法来做到这一点?我想给予他们的选择,以保存到SD卡也如果这是可能的.一个正确的类在文档中使用的点将是伟大的!我一直在谷歌搜索没有用.谢谢!
res/raw
qjp7pelc1#
试试这样的方法:
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(); } } }
des4xlb02#
我不知道raw,但我在我的应用程序中使用assets文件夹做了类似的事情。我的文件在assets/backgrounds文件夹下,你可能从下面的代码中猜到了。您可以修改此代码并使其为您工作(我知道我将只有4个文件,这就是为什么我有i从0到4,但您可以更改为任何您想要的)。这段代码将以prefix_开头的文件(如prefix_1.png、prefix_2.png等)复制到我的缓存目录中,但您显然可以更改扩展名、文件名或您希望保存资产的路径。
raw
assets
assets/backgrounds
i
prefix_
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()); } } }
2条答案
按热度按时间qjp7pelc1#
试试这样的方法:
des4xlb02#
我不知道
raw
,但我在我的应用程序中使用assets
文件夹做了类似的事情。我的文件在assets/backgrounds
文件夹下,你可能从下面的代码中猜到了。您可以修改此代码并使其为您工作(我知道我将只有4个文件,这就是为什么我有
i
从0到4,但您可以更改为任何您想要的)。这段代码将以
prefix_
开头的文件(如prefix_1.png、prefix_2.png等)复制到我的缓存目录中,但您显然可以更改扩展名、文件名或您希望保存资产的路径。