将所有音频文件放在android上的目录中?

时间:2015-11-06 20:25:36

标签: android

我正在使用以下代码从我的Android设备上的目录中获取所有音频文件(实际上是他们的ID,以便我可以稍后使用MediaPlayer播放它们):

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播放文件。我只需要直接在该文件夹中的音频文件,忽略任何子文件夹。它们也应按文件名排序。

1 个答案:

答案 0 :(得分: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;
}