Реализация выбора аудиофайла при нажатии на кнопку

    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.

→ Ссылка