2

我正在使用方法Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC)来获取我的 Android 设备将其音乐保存到的默认目录。

此方法返回的目录存在(类似于 sdcard/music),但它没有任何音乐文件。当我检查我的 sdcard 时,我发现所有音乐文件都存储在另一个由我的一个应用程序命名的目录中(sdcard/qqmusic/song),使用该方法无法找到该目录getExternalStoragePublicDirectory

在这种情况下(不同的设备将音乐存储在不同的位置),无论设备之间的差异如何,有没有什么好的方法来获取路径?

4

1 回答 1

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已经包含了外部存储上的音乐文件,所以你可以直接查询provider来获取所有的音乐文件。

首先检查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列包含该音乐文件的完整路径。

于 2013-03-19T02:59:47.903 回答