2013-03-17 200 views
2

我使用方法​​來獲取我的Android設備保存音樂的默認目錄。Android外部存儲

該方法返回的目錄存在(類似於sdcard/music),但它沒有任何音樂文件。當我檢查我的SD卡時,我發現所有音樂文件都存儲在另一個由我的某個應用程序(sdcard/qqmusic/song)命名的目錄中,這些目錄無法使用getExternalStoragePublicDirectory方法找到。

在這種情況下(不同設備將音樂存儲在不同的位置),有沒有什麼好方法可以獲得路徑,而不管設備間的差異?

+0

讓用戶告訴你這些音樂文件在哪裏是明智的。 – StarPinkER 2013-03-17 04:22:40

+0

我想大多數用戶不會在意他們的設備在哪裏保存音樂文件。 – Allen 2013-03-17 08:15:37

+0

但很明顯,音樂是由qqmusic這是一個在中國流行的應用程序下載。該目錄由該應用程序創建。 – StarPinkER 2013-03-17 08:38:55

回答

0

正如我們在評論中所討論的,我將展示Android音樂應用程序如何查找所有音樂文件。

Android音樂應用程序只需查詢MediaProvider即可獲取外部存儲上的所有音樂,即sdcard。

並且數據庫由MediaScannerService填充。 MediaScannerService調用MediaScanner.scanDirectories來搜索這些目錄下的所有文件。如果它是音頻文件,則獲取元數據並將其放入數據庫(MediaProvider)。

if (MediaProvider.INTERNAL_VOLUME.equals(volume)) { 
    // scan internal media storage 
    directories = new String[] { 
     Environment.getRootDirectory() + "/media", 
    }; 
}else if (MediaProvider.EXTERNAL_VOLUME.equals(volume)) { 
    // scan external storage volumes 
    directories = mExternalStoragePaths; 
} 

if (directories != null) { 
    scan(directories, volume); 
} 

所以我的答案是MediaProvider已經包含在外部存儲的音樂文件,這樣你就可以直接查詢供應商獲得的所有音樂文件。

首先檢查MediaStore

您可以使用以下代碼獲取所有音樂文件。

//Some audio may be explicitly marked as not being music 
String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0"; 

String[] projection = { 
     MediaStore.Audio.Media._ID, 
     MediaStore.Audio.Media.ARTIST, 
     MediaStore.Audio.Media.TITLE, 
     MediaStore.Audio.Media.DATA, 
     MediaStore.Audio.Media.DISPLAY_NAME, 
     MediaStore.Audio.Media.DURATION 
}; 

cursor = this.managedQuery(
     MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, 
     projection, 
     selection, 
     null, 
     null); 

private List<String> songs = new ArrayList<String>(); 
    while(cursor.moveToNext()){ 
     songs.add(cursor.getString(0) + "||" + cursor.getString(1) + "||" + cursor.getString(2) + "||" + cursor.getString(3) + "||" + cursor.getString(4) + "||" + cursor.getString(5)); 
} 

MediaStore.Audio.Media.DATA列包含該音樂文件的完整路徑。

+0

我可以理解遊標部分,但MediaProvider部分讓我困惑。你能否詳細解釋一下? – Allen 2013-03-19 13:41:07

+0

EXTERNAL_VOLUME通常表示sdcard,scan(...)方法調用MediaScanner中的scanDirectory方法,我已經發布了MediaScanner的源代碼,您可以查看它。 @Allen – StarPinkER 2013-03-20 00:19:30