MediaStore列出特定路径下的所有歌曲

3
我希望能够从设备的一个特定路径中获取所有歌曲。 例如,我想从路径“/mnt/sdcard/music/”中的一个特定文件夹“music”获取所有歌曲,那么我需要在我的代码中做哪些改变才能实现这一点呢? 我有一个从设备中获取所有歌曲的方法:
public ArrayList<Song> scanAllSongsOnDevice(Context c)
    {
        ContentResolver musicResolver = c.getContentResolver();
        Uri musicUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
        String col[] ={android.provider.MediaStore.Audio.Media._ID};
Cursor musicCursor = musicResolver.query(musicUri, null, null, null, null);


        if (musicCursor != null && musicCursor.moveToFirst())
        {
            // clear  list to prevent duplicates
            songsList = new ArrayList<>();

            //get columns
            int titleColumn = musicCursor.getColumnIndex
                    (android.provider.MediaStore.Audio.Media.TITLE);
            int idColumn = musicCursor.getColumnIndex
                    (android.provider.MediaStore.Audio.Media._ID);
            int artistColumn = musicCursor.getColumnIndex
                    (android.provider.MediaStore.Audio.Media.ARTIST);
            int isMusicColumn = musicCursor.getColumnIndex
                    (MediaStore.Audio.Media.IS_MUSIC);
            int duration = musicCursor.getColumnIndex
                    (MediaStore.Audio.Media.DURATION);

            //add songs to list
            do
            {
                String filePath = musicCursor.getString(musicCursor.getColumnIndex(MediaStore.Audio.Media.DATA));
                // check if the file is a music and the type is supported
                if (musicCursor.getInt(isMusicColumn) != 0 && filePath != null && (FileExtensionFilter.checkValidExtension(filePath)) && musicCursor.getInt(duration) > 0)
                {
                    int thisId = musicCursor.getInt(idColumn);
                    String thisTitle = musicCursor.getString(titleColumn);
                    String thisArtist = musicCursor.getString(artistColumn);
                    Song song = new Song();
                    song.setId(thisId);
                    if(!thisArtist.equals("<unknown>"))
                    {
                        song.setArtist(thisArtist);
                        song.setTitle(thisTitle);
                    }
                    else
                    {
                        song.setArtist("");
                        song.setTitle("");
                    }
                    song.setSongPath(filePath);
                    File file = new File(filePath);
                    song.setFileName(file.getName().substring(0, (file.getName().length() - 4)));
                    songsList.add(song);
                }
            }
            while (musicCursor.moveToNext());
        }
        else  // if we don't have any media in the folder that we selected set NO MEDIA
        {
            addNoSongs();
        }

        musicCursor.close();

        if(songsList.size() == 0)
        {
            addNoSongs();
        }

        Collections.sort(songsList, new Comparator<Song>()
        {
            @Override
            public int compare(Song song, Song song2)
            {
                int compare = song.getTitle().compareTo(song2.getTitle());
                return ((compare == 0) ? song.getArtist().compareTo(
                        song2.getArtist()) : compare);
            }
        });

        return songsList;
    }
4个回答

9

您需要修改audioCursor,如下:

audioCursor = audioResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null,MediaStore.Audio.Media.DATA + " like ? ",
            new String[] {"%YOUR_SPECIFIC_FOLDER_NAME%"},  null);

希望这可以帮助您...感谢。

1
我不想获取特定的文件名,我想从路径中获取所有歌曲。 - AlexTheLion
@AlexTheLion 你的目标文件夹名是什么?只需将其替换为该名称,即可获取该文件夹中的所有音频。 - kamil
1
如果我输入“音乐”,它会获取该文件夹及其子文件夹中的所有歌曲,这并不是我想要的。我想从一个特定的文件夹中获取所有歌曲。 - AlexTheLion
如果我的特定文件夹是隐藏文件夹,我该怎么从特定的隐藏文件夹中获取数据? - user8147458

0
首先,您需要通过MediaScanner将您的歌曲数据添加到系统的媒体存储中。
    String scanDir = null;
    if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
        scanDir = Environment.getExternalStorageDirectory().getAbsolutePath()
                + File.separator + "music";
    } else {
        // sdcard is not available
    }
    MediaScannerConnection.scanFile(getApplicationContext(), 
            new String[] { scanDir },
            new String[] { "audio/*" }, 
            new OnScanCompletedListener() {

                @Override
                public void onScanCompleted(String path, Uri uri) {
                }
            });

这将发送一个广播意图到框架,框架将扫描您指定的目录并将扫描结果添加到系统媒体存储数据库中。

之后,您可以通过像您粘贴的代码一样的contentresolver访问数据。


那不是我需要的。我想要获取像我的方法“scanAllSongsOnDevice”中一样的歌曲列表。 - AlexTheLion

-1

将您的filePath变量更改为以下内容:

String filePath = Environment.getExternalStorageDirectory() + "/music"; 

-1
public ArrayList<File> findSong(File root) {

        ArrayList<File> al = new ArrayList<File>();
        File[] files = root.listFiles();    // All file and folder automatic collect

        for (File singleFile : files) {
            if (singleFile.isDirectory() && !singleFile.isHidden()) {
                al.addAll(findSong(singleFile)); //Recursively call
            } else {
                if (singleFile.getName().endsWith(".mp3")) {
                    al.add(singleFile);
                }
            }
        }
        return al;
    }

onCreate:

final ArrayList<File> mySongs = findSong(Environment.getExternalStorageDirectory());

        items = new String[mySongs.size()];

        for (int i = 0; i < mySongs.size(); i++) {
            //  toast(mySongs.get(i).getName().toString());
            //  items[i] = mySongs.get(i).getName().toString();
            items[i] = mySongs.get(i).getName().toString().replace(".mp3", "");
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接