2015-03-02 70 views
1

我正在为练习制作音板,并且我想让用户能够在菜单项上点击下载声音(我在应用程序中包含的res/raw文件夹中),但我只能找到有关从互联网网址,而不是我已经包含在apk中的东西。从我的res/raw文件夹下载(复制?)一个文件到默认的Android下载位置?

这样做的最好方法是什么?如果可能的话,我想给他们选择保存到SD卡上。在文档中使用正确类的一点是非常棒的!我一直在使用谷歌搜索无济于事。

谢谢!

+0

这是很容易的,刚才写的答案... – JonasCz 2015-03-02 19:29:18

+0

只是谷歌的'从RES复制文件/生到sdcard'。 – greenapps 2015-03-02 19:29:49

回答

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(); 
    } 
} 
} 
+0

这看起来像是我需要的 - 如果手机中没有SD卡,请将此下载文件下载到默认的下载文件夹中?或者getExternalStorageDirectory()只是找到他们在手机上设置的任何存储区域?谢谢! – shanling 2015-03-02 19:39:19

+0

是的,它会'下载'到下载文件夹中(可能会有所不同),但这只是一个基本示例,您可能想要检查SD卡是否可写等。顺便说一句,有一个完整的代码示例android开发者网站[here](http://developer.android.com/reference/android/os/Environment.html#getExternalStoragePublicDirectory%28java.lang.String%29),这可能比这更好。 – JonasCz 2015-03-02 19:49:10

+0

这是一个伟大的人。谢谢一堆:-) – shanling 2015-03-02 21:27:48

1

我不知道raw,但我在我的应用程序中使用assets文件夹做了类似的事情。我的文件在assets/backgrounds文件夹下,你可以从下面的代码中猜到。 (我知道我只有4个文件,这就是为什么我有i从0到4,但你可以改变它为任何你想要的)。你可以修改这个代码并使它为你工作(我知道我将只有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()); 
      } 
    } 
} 
相关问题