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())下的音频文件,系统文件选择器无法访问该目录,需自行实现文件遍历逻辑:
- 遍历私有目录下的文件,筛选后缀为
.mp3/.wav等音频格式的文件; - 将文件列表展示在
RecyclerView或ListView中供用户选择; - 直接读取文件的
name、通过MediaMetadataRetriever获取艺术家信息,通过File.length()获取文件大小。
内容的提问来源于stack exchange,提问作者mm m
相关产品推荐
相关产品推荐

