Как сохранить аудиофайл с помощью MediaStore API - PullRequest
0 голосов
/ 04 августа 2020

Я хочу загрузить аудиофайл из хранилища firebase, а затем сохранить его на устройстве, чтобы любое другое приложение или проигрыватель musi c (и мое приложение позже) могло получить доступ и воспроизвести.

The Документация говорит, что все файлы мультимедиа с общим доступом (изображения, аудиофайлы, видео) должны быть сохранены с использованием MediaStore API, но я не смог найти ничего полезного о том, как это сделать.

Также я хочу, чтобы файл находился в постоянном месте, таком как MyApp / Audio, чтобы, когда пользователь переходит через проводник, он также мог его найти.

Пожалуйста, предоставьте мне полный пример того, как сделайте это.

Я попытался применить пример из документа следующим образом:

private fun createFile() {
    val resolver = applicationContext.contentResolver

    val audioCollection =
        MediaStore.Audio.Media.getContentUri(if (Build.VERSION.SDK_INT <= 28) VOLUME_EXTERNAL else VOLUME_EXTERNAL_PRIMARY)

    val newSongDetails = ContentValues().apply {
        put(MediaStore.Audio.Media.DISPLAY_NAME, "My Song.mp3")
    }

    val myFavoriteSongUri = resolver.insert(audioCollection, newSongDetails)

    if(myFavoriteSongUri == null){
        Toast.makeText(this, "myFavoriteSongUri is null", Toast.LENGTH_SHORT).show()
        return
    }

    val path = myFavoriteSongUri.path

    if(path == null){
        Toast.makeText(this, "path is null", Toast.LENGTH_SHORT).show()
        return
    }

    downloadFile(File(path))
}

private fun downloadFile(file: File) {
    val url = "example url"
    val ref = Firebase.storage.getReferenceFromUrl(url)
    ref.getFile(file).addOnSuccessListener {
        Toast.makeText(this, "File downloaded!", Toast.LENGTH_SHORT).show()
    }.addOnFailureListener {
        Toast.makeText(this, "Download failed!", Toast.LENGTH_SHORT).show()
    }
}

Во-первых, в документации говорится, что в API <= 28 вместо этого используйте VOLUME_EXTERNAL из VOLUME_EXTERNAL_PRIMARY, но когда я использовал приведенный ниже код, android студия показала мне предупреждение о том, что VOLUME_EXTERNAL требует уровня API 29. </p>

Во-вторых, когда я запускаю код, приложение вылетает с h эта ошибка:

java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.lastIndexOf(int)' on a null object reference
...