Android 本地音乐播放读取系统媒体库 MediaPlayer简介本文介绍如何在 Android 中读取手机本地音乐并进行播放包含ContentResolver.query()参数说明常见查询条件写法MediaPlayer的正确初始化与释放权限与常见崩溃点修复适用场景播放设备中的本地音频文件非在线流媒体。一、读取手机中的音乐本地音频数据通常来自MediaStore通过ContentResolver查询CursorcursorcontentResolver.query(contentUri,projection,selection,selectionArgs,sortOrder);query()常见参数说明contentUri查询目标表例如外部音频库MediaStore.Audio.Media.EXTERNAL_CONTENT_URIprojection要返回的列字段selection筛选条件where子句不带where关键字selectionArgs给selection中?占位符赋值sortOrder排序方式1) 常用 URI修复原文拼写错误原文中的Media.EXTERNL_CONTENT_URL是错误写法正确为MediaStore.Audio.Media.EXTERNAL_CONTENT_URI2) 推荐查询字段String[]projectionnewString[]{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) 推荐筛选条件StringselectionMediaStore.Audio.Media.IS_MUSIC! 0;StringsortOrderMediaStore.Audio.Media.DATE_ADDED DESC;复杂筛选建议使用selectionArgs避免拼接字符串导致可读性差或出错。4) 查询示例含资源释放ListUrimusicUrisnewArrayList();UricontentUriMediaStore.Audio.Media.EXTERNAL_CONTENT_URI;try(CursorcursorgetContentResolver().query(contentUri,projection,selection,null,sortOrder)){if(cursor!null){intidIndexcursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID);while(cursor.moveToNext()){longidcursor.getLong(idIndex);UrisongUriContentUris.withAppendedId(contentUri,id);musicUris.add(songUri);}}}二、使用 MediaPlayer 播放下面给出一个更安全的初始化与播放流程privateRecyclerViewrcList;privateMediaPlayermediaPlayer;privatefinalListUrimusicUrisnewArrayList();OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);rcListfindViewById(R.id.rc_list);rcList.setLayoutManager(newLinearLayoutManager(this));loadMusic();// 查询本地音乐并填充 musicUrisif(!musicUris.isEmpty()){mediaPlayerMediaPlayer.create(this,musicUris.get(0));}}privatevoidplay(){if(mediaPlayer!null!mediaPlayer.isPlaying()){mediaPlayer.start();}}privatevoidpause(){if(mediaPlayer!nullmediaPlayer.isPlaying()){mediaPlayer.pause();}}OverrideprotectedvoidonDestroy(){super.onDestroy();if(mediaPlayer!null){mediaPlayer.release();mediaPlayernull;}}修复点对应原文常见 bugMediaPlayer.create(this, Uri.parse(path))并不总是可靠优先使用content://的Uri播放前需要判空避免musicList.get(0)越界在onDestroy()中调用release()避免内存泄漏和句柄占用三、权限说明Android 6.0 需运行时权限旧版本常见是读取存储权限Android 13 推荐使用READ_MEDIA_AUDIO未授权时直接查询媒体库通常会得到空结果或抛出异常。四、总结本地音乐播放的核心流程是通过MediaStore查询音频数据组装可播放的content://Uri使用MediaPlayer播放并正确释放资源如果后续你需要我可以再帮你把这篇文档继续升级成可直接运行的完整示例含权限申请支持上一首/下一首、进度条、后台播放使用ExoPlayer的现代实现版本github仓库代码https://github.com/lixiangoko/Musicimpleness