You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android设备歌曲元数据(艺术家/专辑等)检索技术咨询

嘿,看起来你已经在Android上用MediaStore检索音乐元数据的路上走了大半啦!我帮你把代码补全并梳理清楚,这样就能顺利拿到你需要的所有字段啦:

检索Android设备内歌曲元数据的完整实现

首先,你已经定义了关键的筛选条件和要查询的元数据字段,接下来补全查询和数据解析的完整代码:

// 筛选条件:只获取标记为音乐的文件
String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0";

// 要查询的元数据字段集合
String[] projection = {
    MediaStore.Audio.Media.ARTIST,    // 艺术家名称
    MediaStore.Audio.Media.ALBUM,     // 专辑名称
    MediaStore.Audio.Media.DATA,      // 歌曲文件路径
    MediaStore.Audio.Media.DISPLAY_NAME, // 歌曲显示名称
    MediaStore.Audio.Media.DURATION  // 歌曲时长(单位:毫秒)
};

// 获取ContentResolver实例,用于访问媒体库
ContentResolver contentResolver = getContentResolver();

// 发起查询请求
Cursor cursor = contentResolver.query(
    MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, // 外部存储的音频内容URI
    projection,
    selection,
    null, // 查询参数(这里不需要)
    null // 排序规则,比如可以写 MediaStore.Audio.Media.TITLE + " ASC" 按标题升序排列
);

// 遍历Cursor提取每首歌的元数据
if (cursor != null && cursor.moveToFirst()) {
    do {
        // 通过列索引获取对应字段的值
        String artist = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
        String album = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM));
        String filePath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
        String songName = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME));
        long durationMs = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));
        
        // 这里可以把数据存入集合或者做你需要的业务处理
        Log.d("MusicInfo", "歌曲:" + songName + " | 艺术家:" + artist + " | 时长:" + durationMs + "ms");
        
    } while (cursor.moveToNext());
    
    // 用完Cursor一定要关闭,避免内存泄漏
    cursor.close();
}

几个关键注意事项:

  • 权限问题:Android 10及以上版本,需要在Manifest中声明READ_EXTERNAL_STORAGE权限(Android 13+可以用更精细的READ_MEDIA_AUDIO权限),并且要动态申请权限后才能正常查询。
  • 字段简化:你之前用的MediaStore.Audio.Media.InterfaceConsts.XXX和直接写MediaStore.Audio.Media.XXX是等价的,后者写法更简洁,是开发者常用的方式。
  • 时长转换:DURATION返回的是毫秒值,如果需要转换成分秒格式,可以加个工具方法:
    private String formatDuration(long durationMs) {
        long minutes = (durationMs / 1000) / 60;
        long seconds = (durationMs / 1000) % 60;
        return String.format("%02d:%02d", minutes, seconds);
    }
    
  • 空指针防护:查询Cursor可能为空,一定要先判断再操作,避免崩溃。

内容的提问来源于stack exchange,提问作者Raducu Mihai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:39:21