You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 12:51:01