当前位置: 首页 > 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.cnnetsun.cn/news/2037426.html

相关文章:

  • RV1126视频采集避坑指南:RKMedia VI模块的5个关键配置项详解
  • 终极指南:如何用SketchUp STL插件轻松实现3D打印模型转换
  • 分钟搞懂深度学习AI:实操篇:ResNet
  • 【Excel提效 No.011】一句话搞定多工作表纵向合并
  • 大模型RAG (二)
  • 告别Excel配置表:在Unity中搭建Luban+Jenkins的自动化配置管线
  • UE5Varest发送https请求发不出去,收不到任何回复
  • 避开这些坑!STM32G474读写FLASH时,关于保护、对齐和中断的避坑指南
  • 【音视频 | ALSA】从内核到应用:深入解析ALSA框架的层次结构与核心组件
  • 从 OpenSwiftUI 到 DanceUI:换个方式 Dive SwiftUI -- 肘子的 Swift 周报 #132
  • SQL如何优化子查询的性能_改写为JOIN关联查询与消除嵌套
  • Anthropic MCP 设计漏洞可导致 RCE,威胁 AI 供应链安全
  • UVM验证中的‘幽灵任务’:如何优雅处理objection未结束导致的PH_TIMEOUT
  • 反向代理与内网穿透实战
  • 微服务架构设计核心原则解析
  • CentOS7.9磁盘管理全栈【20260420】001篇
  • 从数据手册到实际代码:一步步拆解SGP30的IIC通信协议与STM32驱动逻辑
  • Python动态特性与Monkey Patching实战解析
  • GME-Qwen2-VL-2B-Instruct惊艳效果:0.12低匹配文本自动过滤+0.48高匹配标红展示
  • 前端架构设计
  • 05(开源)加工工艺匹配:顶级车床切削参数·刀具适配·工况适配 保姆级开源参数【国产机床登顶系列第五篇】
  • 打卡信奥刷题(3149)用C++实现信奥题 P7677 [COCI 2013/2014 #5] LADICE
  • STC89C52单片机玩转NE555:手把手教你实现一个简易频率计(附完整工程)
  • Qwen3.5-9B-GGUF本地AI办公套件:邮件撰写、会议纪要、PPT大纲一体化
  • CardEditor:3MB轻量级桌游卡牌批量生成器,让设计效率提升300%
  • 如何用macOS自动点击器实现高效自动化操作:完整指南
  • 速看!黄金秘籍解决华为防火墙最困难的故障
  • 电商反爬这道墙,Web Unlocker 是怎么翻过去的?
  • 别再乱喂狗了!AutoSar WdgM三种监控机制(Alive/Deadline/Logical)实战配置避坑指南
  • 国家中小学智慧教育平台电子课本解析工具:3分钟极速获取教学资源的终极指南