Ответы пользователя по тегу Android
  • Почему выходит ошибка 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 я это нигде не нашел.
    Ответ написан
    Комментировать
  • Что изменить в Build.graidle чтобы проект собрался?

    @Anrek Автор вопроса
    Решение было такое:
    чтобы собрать проект удалил Fabric (он устарел) и закомментировал Crashlytics, т.к. на основные функции приложения они не влияли.
    Ответ написан
    Комментировать
  • Как организовать хранение данных о том, что товар просмотрен?

    @Anrek Автор вопроса
    Решил так:
    -использовал не глобальное хранилище для сведений о просмотренных страницах, а локальное на клиенте. Решение не идеальное, но заказчика устроило.
    Ответ написан
    Комментировать
  • Как в cicerone объединить однотипные фрагменты?

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

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

    Fragment MainFragment not attached to a context.

    Проблема решилась при объявлении того же массива в onViewCreated.
    Ответ написан
    Комментировать
  • Зачем нужна @Qualifier, если после нее ничего нет?

    @Anrek Автор вопроса
    Я разобрался. Есть @Qualifier из разных пакетов. Оба они касаются DI (внедрения зависимостей).

    В реальной жизни может сложится ситуация, когда создаётся несколько бинов одного и того же типа (например, с 1 и тем же интерфейсом), но в конкретном случае например необходим конкретный бин. @Qualifier — аннотация позволяет уточнить какой именно.

    1) Есть @Qualifier, которая импортируется из пакета CDI JSR 330 (CDI-это стандарт Java для контекстов и внедрения зависимостей, а JSR-330-это его подмножество, которое он полностью поддерживает), импортируется так:
    import javax.inject.Qualifier
    Ее уточнение не добавляется, просто пишется так:
    @Qualifier

    2) Есть @Qualifier, которая импортируется из пакета фреймворка Spring (фреймворк для внедрения зависимостей), импортируется так:
    import org.springframework.beans.factory.annotation.Qualifier

    И ей как раз указывается "уточнение" в скобках:
    @Qualifier("appContext1")

    В Spring бин называется по имени и вызывается явно по нему.

    В случае JSR 330 для этого создается своя аннотация для разделения зависимостей с одинаковыми интерфейсами и затем применяется и к классу бина и к зависимости. Документ про который шла речь в вопросе как раз перечень таких аннотаций.

    Итого: в Spring - определяемся с необходимым бином по его имени, а в JSR 330 - по имени его аннотации и удобно перечень всех этих аннотаций собрать в отдельный файл (что и сделали).

    Источник (тут же можно и примеры посмотреть)
    Ответ написан
    Комментировать