Реализация выбора аудиофайла при нажатии на кнопку
fun goMusic(view: View)
{
//здесь
}
При нажатие на кнопку происходит переход в эту функцию. Я бы хотел, чтобы открывался каталог с аудиофайлами (которые ранее были установлены на устройство), пользователь выбирает один и далее с ним что-то можно делать. Искал решения, но почему-то все они выдают ошибку. Помогите пожалуйста
Ответы (1 шт):
Автор решения: Falchio
→ Ссылка
Я в своём приложении для получения от пользователя файлов использовал что-то вроде этого:
import androidx.activity.result.contract.ActivityResultContracts
class DocumentsFragment : Fragment() {
companion object {
// 1. Здесь указываем необходимые MIME типы данных
/**@see <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types">MIME types</a>
* @see <a href="https://www.iana.org/assignments/media-types/media-types.xhtml">IANA - MIME types</a>*/
private val MIME_TYPES: Array<String> = arrayOf(
"image/*", "application/pdf", "application/msword",
"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
"application/vnd.oasis.opendocument.text", "text/plain", "text/markdown"
)
}
//2. Регистрируем Activity Result как поле класса фрагмента
private val getContent =
registerForActivityResult(ActivityResultContracts.OpenMultipleDocuments()) {
Log.d("Open documents", "incoming uri: size = ${it.size}")
add(it)
}
...
//3. Ставим ClickListener на нужную кнопку
choiceDocumentButton.setOnClickListener { getContent.launch(MIME_TYPES) }
...
//4. Как-то работаем с полученными ссылками на файлы от пользователя.
private fun add(list: List<Uri>) {
val setOfFiles = copyToAppDir(list)
setOfFiles.forEach {
//TODO: do something
}
}
//5. Здесь я делал копии для продолжения работы с файлами, в случае с mp3 это наверное не обязательно.
private fun copyToAppDir(list: List<Uri>): Set<File> {
val set = mutableSetOf<File>()
list.forEach { uri ->
try {
val file: File = copyUriContentToTempFile(uri)
set.add(file)
} catch (e: Exception) {
e.printStackTrace()
}
}
return set
}
//6. Так можно скопировать по uri переданный пользователем файл, думаю тоже не обязательно.
private fun copyUriContentToTempFile(uri: Uri): File {
val inputStream = requireContext().contentResolver.openInputStream(uri)
inputStream.use { input ->
val tempFile: File = .. ; //TODO: create file
tempFile.outputStream().use { output ->
input?.copyTo(output)
}
return tempFile
}
}
}
В Вашем случае нужно указать MIME типы для музыкальных файлов, например audio/mpeg
. В коде есть две ссылки на списки MIME типов: developer.mozilla, IANA.