如何使用媒体存储获取所有音频文件

How to get all the audio file using mediastore

我正在尝试从设备(内部和 SD 卡)中获取所有媒体文件。直到现在我能够从 SD 卡的固定文件夹中获取所有媒体文件。我浏览了大部分网络mediastore 上的页面。而且我能够获取媒体 info.But 如何从设备中获取所有音频文件任何示例都会有所帮助。 我试过这种方式` public class SongDto {

public long songId;
public String songTitle;
public String songArtist;
public String path;
public short genre;
public long duration;
public String album;
public Bitmap albumArt;

public String toString() {
return String.format("songId: %d, Title: %s, Artist: %s, Path: %s, Genere: %d, Duration %s",
        songId, songTitle, songArtist, path, genre, duration);
}

并在另一个 class 名称中获取这些值

public class Utils {
private Context _context;

// constructor
public Utils(Context context) {
    this._context = context;
}
public static ArrayList<SongDto> getMusicInfos(Context context) {

    ArrayList<SongDto> musicInfos = new ArrayList<SongDto>();

现在我正在尝试在另一个 class

中获取歌曲标题
private ArrayList<SongDto> musicInfos;
private Utils utils;
private ArrayList<String> songPaths = new ArrayList<String>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    utils = new Utils(this);
    songPaths = utils. getMusicInfos(songTitle);
}

private void update(){
    ArrayAdapter<String> list=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,musicInfos.add(songTitle) );
}
}

我如何才能只获得所需的数组,如 songId、songArtist、song 的数组 duration.And 我做错了。如何设置 getMusicInfos 方法 `

你可以试试这个

 ArrayList audio=new ArrayList();
 Cursor c=getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, new String[]{MediaStore.Audio.Media.DISPLAY_NAME}, null, null, null);


while(c.moveToNext())
 {
String name=c.getString(c.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME));
audio.add(name);

 }

同样也可以通过指定INTERNEL_CONTENT_URI

获取内部存储的音频文件

我用这段代码获取了所有歌曲数据

public static ArrayList<SongDto> getMusicInfos(Context context) {

    ArrayList<SongDto> musicInfos = new ArrayList<SongDto>();

    Cursor cursor = context.getContentResolver().query(
            MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null,
            MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
    if (cursor == null) {
        return null;
    }


    for (int i = 0; i < cursor.getCount(); i++) {
        cursor.moveToNext();


        int isMusic = cursor.getInt(cursor
                .getColumnIndex(MediaStore.Audio.Media.IS_MUSIC)); 

        if (isMusic != 0) {
            SongDto music = new SongDto();


            music.path = cursor.getString(cursor
                    .getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));

            if (!new File(music.path).exists()) {
                continue;
            }


            music.songId = cursor.getLong(cursor
                    .getColumnIndexOrThrow(MediaStore.Audio.Media._ID));

            music.songTitle = cursor.getString(cursor
                    .getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));


            music.songTitle = cursor.getString(cursor
                    .getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME));


            music.album = cursor.getString(cursor
                    .getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM));


            music.songArtist = cursor.getString(cursor
                    .getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));

            music.duration = cursor
                    .getLong(cursor
                            .getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));

            MediaMetadataRetriever mmr = new MediaMetadataRetriever();
            mmr.setDataSource(music.path);
            music.albumArt = getBitmap(mmr.getEmbeddedPicture());
            mmr.release();

            musicInfos.add(music);
        }
    }

    return musicInfos;
}

并将其用作数据对象

public class SongDto {

public long songId;
public String songTitle;
public String songArtist;
public String path;
public short genre;
public long duration;
public String album;
public Bitmap albumArt;

public String toString() {
    return String.format("songId: %d, Title: %s, Artist: %s, Path: %s, Genere: %d, Duration %s",
            songId, songTitle, songArtist, path, genre, duration);
}
}

AbumArt 可能为空

获取歌曲 ID 作为列表

 String[] columns = { MediaStore.Audio.Media._ID };
    cursor = managedQuery(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,columns, null, null, null);

并从游标中获取数据。想要同时获取内部和外部存储歌曲列表,目前我还没有办法。

以下代码获取phone中的所有mp3文件(包括从messangers下载的音频文件,录音文件等):

private fun getAllMusics(): List<String> {
    val result = mutableListOf<String>()

    val cursor = contentResolver.query(
        MediaStore.Files.getContentUri("external"),
        arrayOf(MediaStore.Files.FileColumns.DATA),
        "${MediaStore.Files.FileColumns.MIME_TYPE} = ?",
        arrayOf(MimeTypeMap.getSingleton().getMimeTypeFromExtension("mp3")),
        MediaStore.Files.FileColumns.DATE_ADDED
    )

    cursor?.let {
        if (cursor.moveToFirst()) {
            while (cursor.moveToNext()) {
                result.add(cursor.getString(cursor.getColumnIndex(MediaStore.Files.FileColumns.DATA)) ?: "--")
            }
        }
    }

    return result
}

您可以通过修改 selectionselection args 参数来获取其他音频文件(如 WAV、WMA 等)。