Kotlin实现Android播放assets目录mp3的Uri获取与ContentResolver用法
播放assets目录下MP3文件的Uri获取方法
assets属于应用私有资源目录,不需要调用ContentResolver即可直接访问,有两种适配MediaPlayer的实现方案:
- 方案1:无需构造Uri,直接通过AssetFileDescriptor加载(更稳定,无路径解析问题)
val assetFileDescriptor = assets.openFd("target_audio.mp3") val mediaPlayer = MediaPlayer().apply { setAudioAttributes( AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .setUsage(AudioAttributes.USAGE_MEDIA) .build() ) setDataSource(assetFileDescriptor.fileDescriptor, assetFileDescriptor.startOffset, assetFileDescriptor.length) prepare() start() assetFileDescriptor.close() }
- 方案2:如果需要符合你现有代码的Uri参数,直接构造assets专属Uri即可
// assets资源Uri固定格式为 file:///android_asset/ + 你的文件相对assets目录的路径 val myUri = Uri.parse("file:///android_asset/target_audio.mp3") // 后续直接套用你现有的MediaPlayer逻辑即可
注意:如果文件存放在assets的子目录,需要带上子目录路径,比如file:///android_asset/music/pop/test.mp3
ContentResolver的定义与使用方法
是什么
ContentResolver是Android系统提供的跨进程数据访问标准接口,主要作用是让应用可以安全访问其他应用(含系统服务)暴露的共享数据,比如公共存储的媒体文件、通讯录、日历信息等,无需直接操作底层文件路径,适配系统权限管控和不同应用的数据提供规则。
官方文档提到的「通过ContentResolver获取系统本地可用的URI」指的是访问公共存储的共享媒体资源,不适用于你当前的应用私有assets资源场景。
基础使用方法
以获取公共存储内音乐文件的Uri为例:
// 先获取当前应用的ContentResolver实例 val contentResolver = applicationContext.contentResolver // 配置查询参数 val projection = arrayOf(MediaStore.Audio.Media._ID, MediaStore.Audio.Media.DISPLAY_NAME) val selection = "${MediaStore.Audio.Media.IS_MUSIC} = ?" val selectionArgs = arrayOf("1") // 执行查询获取媒体库音频游标 val cursor = contentResolver.query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, projection, selection, selectionArgs, "${MediaStore.Audio.Media.DISPLAY_NAME} ASC" ) cursor?.use { val idColumn = it.getColumnIndexOrThrow(MediaStore.Audio.Media._ID) while (it.moveToNext()) { val audioId = it.getLong(idColumn) // 构造对应音频的Content Uri val audioUri = ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, audioId) // 拿到Uri后即可传入MediaPlayer使用 } }
核心使用要点
- 访问不同类型的共享数据需要使用对应系统约定的Uri前缀,比如公共音频前缀为
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,通讯录前缀为ContactsContract.Contacts.CONTENT_URI - 访问外部共享数据需要申请对应权限,比如Android 13及以上获取音频需要
READ_MEDIA_AUDIO权限,低版本需要READ_EXTERNAL_STORAGE权限 - ContentResolver支持四类数据操作:
query()(查询)、insert()(新增)、update()(修改)、delete()(删除)
内容的提问来源于stack exchange,提问作者WMalan
相关产品推荐
相关产品推荐

