我正在开发一个应用程序,我正在尝试添加搜索(和播放)音频文件的功能。现在我遇到一个问题,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
修复了它:
val selectionArgs = arrayOf("%${query}", "%${query}")
后面也应该有%:
val selectionArgs = arrayOf("%${query}%", "%${query}%")