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
相关产品推荐
相关产品推荐

