2015-11-06 52 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无法再找到它的文件,这是有道理的。但是有没有办法解决这个问题? –

相关问题