Я работаю над приложением и пытаюсь добавить в него функции поиска (и воспроизведения) аудиофайлов. Прямо сейчас у меня возникла проблема: ContentResolver MediaStore ничего не возвращает после запроса.
fun search(query: String): MutableList {
val outputTracks = mutableListOf()
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:
Я тестировал как на виртуальном компьютере, так и на реальном телефоне; безуспешно.
На виртуальном диске я использовал Проводник устройств, чтобы добавить .mp3 в папку «Загрузки» в качестве папки «Музыка».
Я создаю «SearchManager» в своем onCreate(), используя: sm = SearchManager(applicationContext).
Использование API 35 для моего AVD. Проблема не в запросе; это также не работает при передаче значения null для обоих вариантов выбора в качестве selectArgs. Я синхронизировал файлы после их загрузки. Как вы можете догадаться, Logcat никогда не печатал «не пусто».
Изменить: использование INTERNAL_CONTENT_URI вместо этого дает мне результаты Deneb.ogg, Girtab.ogg и OrganDub.ogg (примеры звуков помещены в мой проект с помощью Android Studio, я полагаю). Но использование EXTERNAL_CONTENT_URI по-прежнему не дает результатов.
Edit2:
Разрешения запрашиваются во время выполнения, и когда я захожу в настройки на виртуальном диске, он говорит, что разрешение предоставлено. Используемый код:
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
Подробнее здесь: https://stackoverflow.com/questions/790 ... external-c
MediaStore contentResolver ничего не возвращает при поиске в EXTERNAL_CONTENT_URI ⇐ Android
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение