MediaStore contentResolver 在 EXTERNAL_CONTENT_URI 中搜索时不返回任何内容

问题描述 投票:0回答:1

我正在开发一个应用程序,我正在尝试添加搜索(和播放)音频文件的功能。现在我遇到一个问题,MediaStore contentResolver 在查询后没有返回任何内容。

fun search(query: String): MutableList<Track> {

        val outputTracks = mutableListOf<Track>()

        val projection = arrayOf(
            MediaStore.Audio.Media._ID,            // ID of the audio file
            MediaStore.Audio.Media.DISPLAY_NAME,   // Name of the audio file
            MediaStore.Audio.Media.TITLE,
            MediaStore.Audio.Media.ARTIST,
            MediaStore.Audio.Media.DURATION,
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                MediaStore.Audio.Media.RELATIVE_PATH
            } else {
                MediaStore.Audio.Media.DATA
            }
        )

        val selection = "(${MediaStore.Audio.Media.DISPLAY_NAME} LIKE ? OR ${MediaStore.Audio.Media.TITLE} LIKE ?)"
        val selectionArgs = arrayOf("%${query}", "%${query}")

        try {
            context.contentResolver.query(
                MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                projection,
                selection,
                selectionArgs,
                null
            )?.use { cursor ->
                Log.i("FILETEST", "yaya2")
                if (cursor.count == 0) {
                    Log.i("FILETEST", "empty")
                } else {
                    Log.i("FILETEST", "not empty")
                }
                while (cursor.moveToNext()) {
                    Log.i(
                        "FILETEST",
                        cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME))
                    )

                    outputTracks.add(cursorToTrackClass(cursor))

                }
            }
        } catch (e: IllegalArgumentException) {
            Log.e("FILETEST", "Query failed: ", e)
        }

        return outputTracks

我将这些添加到我的 AndroidManifest 中:

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

我在 VD 和实际手机上进行了测试;没有成功。 在 VD 上,我使用设备资源管理器将 .mp3 添加到下载文件夹作为音乐文件夹。 我使用以下方法在 onCreate() 中创建了一个“SearchManager”:

sm = SearchManager(applicationContext)
。 我的 AVD 使用 API 35。查询不是问题;当为两个选择传递 null 作为selectionArgs 时,它也不起作用。我上传文件后同步了它们。你可以猜到,Logcat 从来没有打印过“notempty”。

编辑:使用 INTERNAL_CONTENT_URI 确实会给我结果 Deneb.ogg、Girtab.ogg 和 OrganDub.ogg(我假设是 Android Studio 将示例声音放入我的项目中)。但使用 EXTERNAL_CONTENT_URI 仍然没有结果

编辑2: 在运行时请求权限,当我进入 VD 上的设置时,它显示已授予权限。使用的代码:

val requestPermissionLauncher =
            registerForActivityResult(ActivityResultContracts.RequestPermission())
            { isGranted: Boolean ->
                if (!isGranted) {
                    // Permission not granted, show snackbar that says that app is unusable
                    // and/or close app
                    // NotifyNoPermissionSnackbar()
                }
            }
        // Check android version to support both older as newer android versions
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            // Ask permission if not granted, else do nothing
            if (ContextCompat.checkSelfPermission(this,
                    Manifest.permission.READ_MEDIA_AUDIO) != PackageManager.PERMISSION_GRANTED) {
                    // If permission not already granted, ask for permission
                    requestPermissionLauncher.launch(Manifest.permission.READ_MEDIA_AUDIO)
            }
        }
        else {
            // Ask permission READ_EXTERNAL_STORAGE instead, for older android versions
            if (ContextCompat.checkSelfPermission(this,
                    Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                // Ask permission if not granted, else do nothing
                if (ContextCompat.checkSelfPermission(this,
                        Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                    // If permission not already granted, ask for permission
                    requestPermissionLauncher.launch(Manifest.permission.READ_EXTERNAL_STORAGE)
                }
            }
        }```

Edit3: title
android mediastore
1个回答
0
投票

修复了它:

val selectionArgs = arrayOf("%${query}", "%${query}")
后面也应该有%:
val selectionArgs = arrayOf("%${query}%", "%${query}%")

© www.soinside.com 2019 - 2024. All rights reserved.