Ответы пользователя по тегу Kotlin
  • Почему выходит ошибка No such file or directory при отправке pdf в удаленное хранилище?

    @Anrek Автор вопроса
    Я сделал 2 ошибки:
    1) выше апи 29 получать абсолютный путь нельзя (изменили из соображений безопасности) - поэтому выходила ошибка No such file or directory, нужно копировать файл в кеш папку приложения.
    2) pdf файл нужно не только создать но и записать туда данные, а я только создал (и после того как исправил ошибку еще долго искал почему на сервер приходит пустой файл).

    Итого решение выглядит так (основные шаги)

    1) Запускаю окно выбора файла:
    Intent
    val pdfIntent = Intent(Intent.ACTION_GET_CONTENT)
    pdfIntent.type = "application/pdf"
    pdfIntent.addCategory(Intent.CATEGORY_OPENABLE)
    startActivityForResult(pdfIntent, 12)


    2) Переопределяю fun onActivityResult, в ней из полученной в ней data получаю uri и отправляю его сначала в функцию getDriveFilePath(uri)
    val uri = data.data
    Функция getDriveFilePath создает 2 File() и 2 stream и копирует данные по stream в файл в кеш директории (если не скопировать данные, а только создать файл, на сервер придет пустой файл, и еще важно копировать данные как для символьного файла, а не как для картинки, иначе тоже будет пустой файл).
    Функция getDriveFilePath

    val file = File(requireContext().getCacheDir(), name)
    try {
    val instream: InputStream = requireContext().getContentResolver().openInputStream(uri)!!
    val output = FileOutputStream(file)
    val buffer = ByteArray(1024)
    var size: Int
    while (instream.read(buffer).also { size = it } != -1) {
    output.write(buffer, 0, size)
    }
    instream.close()
    output.close()
    } catch (e: IOException) {
    Log.d("TAG1", "e: ${e}")
    }


    3) Отправляем полученный file в retrofit функцию, прикрепляем его к запросу и все.
    file.asRequestBody("application/pdf".toMediaTypeOrNull())


    Надеюсь это кому-то пригодится, потому что в полном виде для pdf я это нигде не нашел.
    Ответ написан
    Комментировать
  • Как в cicerone объединить однотипные фрагменты?

    @Anrek Автор вопроса
    Решил так:
    создавать вьюхи как compain object непосредственно при инициализации класса. А для навигации применять data class.
    Ответ написан
    Комментировать
  • Почему вылетает приложение при использовании строки из enum class?

    @Anrek Автор вопроса
    Дело было в том, что я объявил массив и переменную тоже прямо в теле класса. А эта переменная опирается на view. А так как фрагмент еще не создался мне выходила ошибка:

    Fragment MainFragment not attached to a context.

    Проблема решилась при объявлении того же массива в onViewCreated.
    Ответ написан
    Комментировать