Как переместить файл во внутреннюю память (зарезервированную память приложения) в Android с помощью Kotlin? - PullRequest
0 голосов
/ 22 февраля 2019

Несмотря на название, очень похожее на другие в Stack Overflow, ни одна из встреченных мной возможностей мне не подходит.

Я загружаю файл с помощью DownloadManager (я выбрал этот способ из-зафакт, что я новичок в android и kotlin, и мне показалось, что я могу скачать файл через DM и затем скопировать его во внутреннее хранилище + удалить его из папки Download, чем вручную управлять созданием потоков для обработки загрузки непосредственно во внутреннее хранилище).

Тогда я пытаюсь переместить его во внутреннюю память.Файлы могут быть изображениями, но в основном mp3-файлами.Сейчас я разрабатываю часть для чтения mp3.Загрузка в порядке, но у меня есть проблемы с копированием файла во внутреннее хранилище. Вот мой код:

if(myDownloadKind == "I"){ // string "I" stands for "internal"

    println("myTag - into BroadCast for inner")

    var myStoredFile:String = uri.toString()
    println("mytag - myStoredFile: $myStoredFile")
    // here I try to convert the mp3 file into a ByteArray to copy it
    var data:ByteArray = Files.readAllBytes(Paths.get(myStoredFile))
    println("myTag - data: $data")

    var myOutputStream: FileOutputStream
    // write file in internal storage
    try {
        myOutputStream = context.openFileOutput(myStoredFile, Context.MODE_PRIVATE)
        myOutputStream.write(data) // NOT WORKING!!
    }catch (e: Exception){
        e.printStackTrace() 
    }


} else if (myDownloadKind == "E"){
  // now this doesn't matter, Saving in external storage is ok
}

Я действительно не могу найти документацию начального уровня (для noob!), Поэтому я 'Я борюсь с очень простой вещью, я думаю ...

1 Ответ

0 голосов
/ 22 февраля 2019

Хорошо, наконец-то мне удалось исправить мою проблему.Я поставил здесь ссылку на ответ, который спас мой день (наконец-то я его нашел): сохранить файл на внутреннюю память в Android?

Я просто изменил (просто для сохранения копии из ВнешнегоХранение) источник InputStream, указывающий на мой собственный файл!Кроме того, я наконец понял «систему InputStream» и, конечно, я переписал цикл while в стиле Kotlin-esque

try {
    println("myTag - into BroadCast for inner")

    val downloadedFile = File(uri.toString())
    val fileInputStream = FileInputStream(downloadedFile)
    println("myTag - input stream of file: $fileInputStream")

    val inputStream = fileInputStream
    val inStream = BufferedInputStream(inputStream, 1024 * 5)

    val file = File(context.getDir("Music", Context.MODE_PRIVATE), "/$myFilename$myExtensionVar")
    println("myTag - my cavolo di file: $file")

    if (file.exists()) {
        file.delete()
    }
    file.createNewFile()

    val outStream = FileOutputStream(file)
    val buff = ByteArray(5 * 1024)

    var len = 0
    while(inStream.read(buff).also { len = it } >= 0){
        outStream.write(buff, 0, len)
    }

    outStream.flush()
    outStream.close()
    inStream.close()

} catch (e: Exception) {
    e.printStackTrace()
}

Я думаю, однако, я просто скачаю файл прямо во внутреннюю память.

...