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

Android开发:如何从internal storage选音频并在TextView显示元数据?

Android 选择音频文件并显示信息实现方案

核心步骤说明

如果你的需求是从**公共内部存储(如系统Music目录)**选择音频文件,可通过以下步骤实现;若目标是应用私有内部存储,需额外实现自定义文件浏览器(系统选择器无法访问应用私有目录)。

1. 注册音频选择回调

使用ActivityResultContracts.GetContent()替代已弃用的startActivityForResult,处理文件选择结果:

private val pickAudioLauncher = registerForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri? ->
    uri?.let { fetchAudioMetadata(it) }
}

2. 触发文件选择

在按钮点击事件中启动系统文件选择器,指定音频类型:

btnPickAudio.setOnClickListener {
    pickAudioLauncher.launch("audio/*")
}

3. 查询音频元数据

通过ContentResolver从MediaStore中读取文件名、艺术家、文件大小信息:

private fun fetchAudioMetadata(uri: Uri) {
    // 定义需要查询的媒体列
    val projection = arrayOf(
        MediaStore.Audio.Media.DISPLAY_NAME,
        MediaStore.Audio.Media.ARTIST,
        MediaStore.Audio.Media.SIZE
    )

    contentResolver.query(uri, projection, null, null, null)?.use { cursor ->
        if (cursor.moveToFirst()) {
            // 提取数据
            val fileName = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME))
            val artist = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST))
            val rawSize = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE))
            // 转换为可读的文件大小格式
            val sizeText = String.format("%.2f MB", rawSize / (1024.0 * 1024.0))

            // 绑定到TextView
            tvFileName.text = "文件名: $fileName"
            tvArtist.text = "艺术家: $artist"
            tvFileSize.text = "文件大小: $sizeText"
        }
    }
}

4. 权限配置

  • Android 13+:在AndroidManifest.xml中添加音频读取权限:
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
  • Android 12及以下:需要READ_EXTERNAL_STORAGE权限,并在运行时动态申请:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), 1001)
}

应用私有内部存储的特殊处理

若你需要选择应用私有目录(getFilesDir()/getCacheDir())下的音频文件,系统文件选择器无法访问该目录,需自行实现文件遍历逻辑:

  1. 遍历私有目录下的文件,筛选后缀为.mp3/.wav等音频格式的文件;
  2. 将文件列表展示在RecyclerView或ListView中供用户选择;
  3. 直接读取文件的name、通过MediaMetadataRetriever获取艺术家信息,通过File.length()获取文件大小。

内容的提问来源于stack exchange,提问作者mm m

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 19:35:45