2015-03-02 69 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()); 
      } 
    } 
} 
相關問題