2015-11-06 890 views
-1

我使用下面的代碼來獲取所有的音頻文件(實際上是它們的ID,所以我可以在以後用MediaPlayer發揮他們)從一個目錄Android設備上:在Android上獲取目錄中的所有音頻文件?

ContentResolver cr = context.getContentResolver(); 
Uri audioUri = MediaStore.Audio.Media.getContentUriForPath(dir.getPath()); //dir is a File object representing the dir I'm looking in 
Cursor audioCursor = cr.query(audioUri, null, null, null, null); 

if (audioCursor != null && audioCursor.moveToFirst()) { 
    int idColumn = audioCursor.getColumnIndex(MediaStore.Audio.Media._ID); 

    List<Long> fileIds = new ArrayList<>(); 
    do { 
     long id = audioCursor.getLong(idColumn); 
     fileIds.add(id); 
    } while (audioCursor.moveToNext()); 

    return fileIds; 
} else { 
    return null; 
} 

然而對於某種原因,它返回一個有2904個ID的數組,用於我給它的任何目錄。我猜測我的設備上有2904個音頻文件(當我使用Uri audioUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI時,它也返回2904個ID)。所以看起來我錯誤地使用了getContentUriForPath,但是android reference沒有提供任何信息。

這應該如何工作?

關於我想要做什麼的一些更多信息(如果它在您的答案中有所不同):我仍在研究代碼,嘗試不同的事情。最終我想用MediaPlayer播放這些文件。我只需要直接在該文件夾中的音頻文件,忽略任何子文件夾。它們也應該按文件名進行排序。

回答

3

您不能將getContentUriForPath與文件夾一起使用,在此路徑中沒有註冊任何內容。在這種情況下,getContentUriForPath返回標準EXTERNAL_CONTENT_URI,因此您可以獲得所有可用的ID。

這回都包含在一個特定的文件夾(例如/storage/emulated/0/Music/),忽略所有子文件夾,並下令由文件名的文件:

Cursor audioCursor = context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, 
       null, 
       MediaStore.Audio.Media.DATA + " LIKE ? AND " + MediaStore.Audio.Media.DATA + " NOT LIKE ?", 
       new String[]{path + "%", path + "%/%"}, 
       MediaStore.Audio.Media.DISPLAY_NAME + " ASC"); 

if (audioCursor != null && audioCursor.moveToFirst()) { 
    int idColumn = audioCursor.getColumnIndex(MediaStore.Audio.Media._ID); 

    List<Long> fileIds = new ArrayList<>(); 
    do { 
     long id = audioCursor.getLong(idColumn); 
     fileIds.add(id); 
    } while (audioCursor.moveToNext()); 

    return fileIds; 
} else { 
    return null; 
} 
+0

啊哈,是有道理的。這確實解釋了爲什麼我只是得到了一切。他們應該真的把這個添加到文檔中。也非常感謝代碼,我想我已經開始理解這個查詢和光標的東西:D –

+0

好吧,終於到處去測試它。雖然我必須確保我的「路徑」變量以「/」結尾,但當我使用'dir.getPath()'時,它不起作用。謝謝! (對不起,btw不接受你的答案,錯了,並沒有立即注意到。) 但是,我用這個來製作一個音頻書應用程序,所以我想添加一個'.nomedia'文件放到有聲讀物的根文件夾中(所以其他音樂播放器不會將它們僅顯示爲音樂文件),但是然後contentResolver無法再找到它的文件,這是有道理的。但是有沒有辦法解決這個問題? –

相關問題