当前位置: 首页 > news >正文

Android 本地音乐播放(读取系统媒体库 + MediaPlayer)

Android 本地音乐播放(读取系统媒体库 + MediaPlayer)

简介

本文介绍如何在 Android 中读取手机本地音乐并进行播放,包含:

  • ContentResolver.query()参数说明
  • 常见查询条件写法
  • MediaPlayer的正确初始化与释放
  • 权限与常见崩溃点修复

适用场景:播放设备中的本地音频文件(非在线流媒体)。


一、读取手机中的音乐

本地音频数据通常来自MediaStore,通过ContentResolver查询:

Cursorcursor=contentResolver.query(contentUri,projection,selection,selectionArgs,sortOrder);

query()常见参数说明:

  1. contentUri:查询目标表,例如外部音频库:
    MediaStore.Audio.Media.EXTERNAL_CONTENT_URI

  2. projection:要返回的列(字段)

  3. selection:筛选条件(where子句,不带where关键字)

  4. selectionArgs:给selection?占位符赋值

  5. sortOrder:排序方式

1) 常用 URI(修复原文拼写错误)

原文中的Media.EXTERNL_CONTENT_URL是错误写法,正确为:

MediaStore.Audio.Media.EXTERNAL_CONTENT_URI

2) 推荐查询字段

String[]projection=newString[]{MediaStore.Audio.Media._ID,MediaStore.Audio.Media.DISPLAY_NAME,MediaStore.Audio.Media.ARTIST,MediaStore.Audio.Media.ALBUM,MediaStore.Audio.Media.DURATION,MediaStore.Audio.Media.SIZE};

说明:MediaStore.Audio.Media.DATA_data)在高版本中已不推荐直接使用,建议优先使用content://类型的Uri来播放。

3) 推荐筛选条件

Stringselection=MediaStore.Audio.Media.IS_MUSIC+"!= 0";StringsortOrder=MediaStore.Audio.Media.DATE_ADDED+" DESC";

复杂筛选建议使用selectionArgs,避免拼接字符串导致可读性差或出错。

4) 查询示例(含资源释放)

List<Uri>musicUris=newArrayList<>();UricontentUri=MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;try(Cursorcursor=getContentResolver().query(contentUri,projection,selection,null,sortOrder)){if(cursor!=null){intidIndex=cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID);while(cursor.moveToNext()){longid=cursor.getLong(idIndex);UrisongUri=ContentUris.withAppendedId(contentUri,id);musicUris.add(songUri);}}}

二、使用 MediaPlayer 播放

下面给出一个更安全的初始化与播放流程:

privateRecyclerViewrcList;privateMediaPlayermediaPlayer;privatefinalList<Uri>musicUris=newArrayList<>();@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);rcList=findViewById(R.id.rc_list);rcList.setLayoutManager(newLinearLayoutManager(this));loadMusic();// 查询本地音乐并填充 musicUrisif(!musicUris.isEmpty()){mediaPlayer=MediaPlayer.create(this,musicUris.get(0));}}privatevoidplay(){if(mediaPlayer!=null&&!mediaPlayer.isPlaying()){mediaPlayer.start();}}privatevoidpause(){if(mediaPlayer!=null&&mediaPlayer.isPlaying()){mediaPlayer.pause();}}@OverrideprotectedvoidonDestroy(){super.onDestroy();if(mediaPlayer!=null){mediaPlayer.release();mediaPlayer=null;}}

修复点(对应原文常见 bug)

  • MediaPlayer.create(this, Uri.parse(path))并不总是可靠,优先使用content://Uri
  • 播放前需要判空,避免musicList.get(0)越界
  • onDestroy()中调用release(),避免内存泄漏和句柄占用

三、权限说明

  • Android 6.0+ 需运行时权限(旧版本常见是读取存储权限)
  • Android 13+ 推荐使用READ_MEDIA_AUDIO

未授权时直接查询媒体库,通常会得到空结果或抛出异常。


四、总结

本地音乐播放的核心流程是:

  1. 通过MediaStore查询音频数据
  2. 组装可播放的content://Uri
  3. 使用MediaPlayer播放并正确释放资源

如果后续你需要,我可以再帮你把这篇文档继续升级成:

  • 可直接运行的完整示例(含权限申请)
  • 支持上一首/下一首、进度条、后台播放
  • 使用ExoPlayer的现代实现版本

github仓库代码

https://github.com/lixiangoko/Musicimpleness
http://www.jsqmd.com/news/684343/

相关文章:

  • 从5G回看通信原理:那些课本上的概念(OFDM、多址、衰落)到底是怎么用的?
  • 双非跨考哈工大计算机,我是如何用CSAPP和真题啃下854专业课的?
  • 从原理到防御:深入解析泛洪攻击(Flood Attack)的攻防博弈
  • nli-MiniLM2-L6-H768在教育行业落地:学生问答自动归类与知识点匹配案例
  • 当AI的“记忆仓库“塞不下时,它们是怎么聪明腾地方的?
  • Python类方法怎么定义@classmethod与@staticmethod区别
  • 终极指南:5分钟掌握LunaTranslator游戏翻译工具
  • MongoDB安装
  • 大语言模型推理能力全解析:从情感分析到主题识别,一行提示搞定NLP任务(附代码)
  • Docker集群网络配置失效全复盘(跨主机通信中断的7个隐性根源)
  • Python 字典高效合并与重复键自定义处理指南
  • mysql如何配置审计日志输出_mysql audit_log_format设置
  • RoCE测试(笔记)
  • 基于CNN的情感识别模型实战:从数据增强到部署优化
  • 046、使用单元测试框架测试FreeRTOS任务与模块:从一次深夜调试说起
  • 高维非线性抛物型PDE求解:FBSDE框架与局部线性回归技术
  • Python 7 天入门 day_05:示例代码跟着敲
  • 量化感知训练QAT失效?内存带宽瓶颈难突破?,.NET 11 AI推理面试必考的4类底层陷阱与绕过方案
  • KrkrzExtract:新一代krkrz引擎资源处理工具的完整指南
  • C#怎么实现图片添加水印 C#如何用代码在图片上添加文字水印和Logo图片水印【图像】
  • 【从零到一】HTML表单<form>与<input>核心用法完全指南
  • 从STC12到STC8H:手把手教你用串口调试助手读取单片机唯一ID(附完整C51代码)
  • 收藏|2026年版 Java 程序员转型 AI 大模型开发,职业跃迁全攻略
  • 为什么说TikTokCommentScraper是评论数据采集的“智能收割机“?
  • [FastMCP设计、原理与应用-12]Provider——组件装载机,为框架按需配置功能单元与底层设施
  • 为什么你的.NET AI服务总在凌晨扩容?揭秘.NET 11 GC第4代分代压缩算法与推理负载的隐性冲突(附GC压力热力图诊断工具)
  • 避开这些坑!STM32G474读写FLASH时,关于保护、对齐和中断的避坑指南
  • 程序员AI进阶:边学边做的极速实战路径
  • 首发|OpenClaw首个TikTok爆款视频生成Skill,一只龙虾搞定爆款爆款短视频
  • 如何防止MongoDB副本集被误初始化_副本集名称(replSetName)锁定