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

Android Kotlin无法从外部存储查询音频文件求助

无法获取Android设备Music目录下的音频文件问题求助

我正尝试在Android设备上查询Music目录下的所有音频文件,但始终无法获取到目标文件。目标文件位于storage/emulated/0/Music目录下,均为.mp3格式。当使用MediaStore.Audio.Media.INTERNAL_CONTENT_URI替代MediaStore.Audio.Media.EXTERNAL_CONTENT_URI时,仅能获取到铃声和提示音,无法得到需要的音频文件。我尝试过声明projection、selection和sortOrder,也在Manifest中添加了权限,但问题仍未解决。

MainActivity代码

import android.content.Context
import android.media.AudioAttributes
import android.media.MediaPlayer
import android.net.Uri
import android.os.Bundle
import android.provider.MediaStore
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import com.example.musicplayer.Song
import com.example.musicplayer.components.activities.MainActivityScreen


class MainActivity : ComponentActivity() {


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val audioList = querySongData(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, applicationContext)

        setContent {

        }
    }

    private fun querySongData(uri: Uri, context: Context) : List<Song> {
        val audioCursor = context.contentResolver
            .query(
                uri,
                null,
                null,
                null,
                MediaStore.Audio.Media.TITLE + " ASC"
            )

        val files = mutableListOf<Song>()
        if (audioCursor != null && audioCursor.moveToFirst()) {
            do {
                val audioTitle = audioCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE)
                val audioArtist = audioCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST)
                val audioDuration = audioCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION)
                val audioUri = audioCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)
                files.add(
                    Song(
                        title = audioCursor.getString(audioTitle),
                        artist = audioCursor.getString(audioArtist),
                        lengthInSeconds = audioCursor.getInt(audioDuration),
                        image = Uri.parse(audioCursor.getString(audioUri)),
                    )
                )
            } while (audioCursor.moveToNext())
        }
        audioCursor?.close()
        return files
    }

}

Song数据类代码

data class Song(
    val title : String,
    val artist : String,
    val image : Uri,
    val lengthInSeconds : Int
)

尝试过的projection、selection配置

val projection = arrayOf(
            MediaStore.Audio.Media.TITLE,
            MediaStore.Audio.Media.ARTIST,
            MediaStore.Audio.Media.DURATION,
            MediaStore.Audio.Media.DATA
        )
val selection = "${MediaStore.Audio.Media.IS_MUSIC} != 0"
val sortOrder = "${MediaStore.Audio.Media.TITLE} ASC"
val audioCursor = context.contentResolver
            .query(
                uri,
                projection,
                selection,
                null,
                sortOrder
            )

Manifest中添加的权限

<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

相关日志信息

13:16:37.671  D  No Network Security Config specified, using platform default
13:16:37.671  D  No Network Security Config specified, using platform default
13:16:37.686  D  loaded /vendor/lib/egl/libEGL_emulation.so
13:16:37.687  D  loaded /vendor/lib/egl/libGLESv1_CM_emulation.so
13:16:37.688  D  loaded /vendor/lib/egl/libGLESv2_emulation.so
13:16:37.710  I  START
13:16:37.724  I  END
13:16:37.771  D  HostConnection::get() New Host Connection established 0xec1ad260, tid 11244
13:16:37.775  D  HostComposition ext ANDROID_EMU_CHECKSUM_HELPER_v1 ANDROID_EMU_dma_v1 ANDROID_EMU_direct_mem ANDROID_EMU_host_composition_v1 ANDROID_EMU_host_composition_v2 ANDROID_EMU_YUV_Cache ANDROID_EMU_has_shared_slots_host_memory_allocator ANDROID_EMU_sync_buffer_data ANDROID_EMU_read_color_buffer_dma GL_OES_EGL_image_external_essl3 GL_OES_vertex_array_object GL_KHR_texture_compression_astc_ldr ANDROID_EMU_host_side_tracing ANDROID_EMU_gles_max_version_3_0 
13:16:37.778  D  eglCreateContext: 0xec1adab0: maj 3 min 0 rcv 3
13:16:37.778  D  eglMakeCurrent: 0xec1adab0: ver 3 0 (tinfo 0xec4f6e50) (first time)
13:16:37.791  I  mapper 4.x is not supported
13:16:37.817  D  createUnique: call
13:16:37.817  D  HostConnection::get() New Host Connection established 0xec1ad880, tid 11244
13:16:37.817  D  allocate: Ask for block of size 0x100
13:16:37.817  D  allocate: ioctl allocate returned offset 0x3f7ffe000 size 0x2000
13:16:37.849  D  HostComposition ext ANDROID_EMU_CHECKSUM_HELPER_v1 ANDROID_EMU_dma_v1 ANDROID_EMU_direct_mem ANDROID_EMU_host_composition_v1 ANDROID_EMU_host_composition_v2 ANDROID_EMU_YUV_Cache ANDROID_EMU_has_shared_slots_host_memory_allocator ANDROID_EMU_sync_buffer_data ANDROID_EMU_read_color_buffer_dma GL_OES_EGL_image_external_essl3 GL_OES_vertex_array_object GL_KHR_texture_compression_astc_ldr ANDROID_EMU_host_side_tracing ANDROID_EMU_gles_max_version_3_0 
13:16:39.271  W  A resource failed to call close. 
13:16:43.562  D  Installing profile for com.example.musicplayer

内容的提问来源于stack exchange,提问作者Luca Schuhmacher

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 02:54:56