Изображение сохраняется в папке приложения с размером 0 байт в Kotlin? - PullRequest
0 голосов
/ 26 мая 2020

Я использую стороннюю библиотеку для открытия галереи и камеры. Я сделал это. Теперь, когда я выбираю несколько изображений или одно изображение, я получаю массив URI из сторонней библиотеки. Теперь я создал файл в папке пакета приложения и смог его создать. Но когда я проверяю папку приложения, размер изображения составляет 0 байт. Я сохраняю путь также в локальной базе данных, а позже загружу его на сервер, используя multipart. Ниже мой код.

Чтобы открыть галерею и камеру,

private fun openPicker() {
    PhotoPickerFragment.newInstance(
        multiple = true,
        allowCamera = true,
        maxSelection = 5,
        theme = R.style.ChiliPhotoPicker_Light
    ).show(childFragmentManager, "picker")
}

получил URI выбранного пути изображения и сохранил путь в локальной базе данных с помощью createFile

override fun onImagesPicked(photos: ArrayList<Uri>) {

        Log.e("TAG", "pic" + photos.joinToString(separator = "\n") { it.toString() })

        fileList = ArrayList<File>()

        try {
            photos.forEachIndexed { index, e ->
                println("$e at ${photos[index].path}")
                val destinationFile: File = createImageFile()
                fileList.add(destinationFile)

                fileList.also {

                    // Get the file-name from the image-path
                    val destinationFilePath = it[index].absolutePath
                    val fileName =
                        destinationFilePath.substring(destinationFilePath.lastIndexOf("/") + 1)

                    val attachment = AttachSiteImage()
                    attachment.apply {
                        callLoggingId = callLoggingIdForAttachment
                        attachmentFileName = fileName
                        attachmentPath = destinationFilePath

                    }
                    attachImageviewModel?.addAttachFromApi(attachment)
                }
            }
            Log.e("TAG", "Path->" + fileList.size)

        } catch (ex: FileAlreadyExistsException) {
            //  sourceFile.delete()
            cl_attachments_main_container.showSnackBar(
                if (!ex.localizedMessage.isNullOrEmpty())
                    ex.localizedMessage
                else
                    ex.stackTrace.toString(),
                Snackbar.LENGTH_SHORT
            )
        } catch (ex: IOException) {
            //   sourceFile.delete()
            cl_attachments_main_container.showSnackBar(
                if (!ex.localizedMessage.isNullOrEmpty())
                    ex.localizedMessage
                else
                    ex.stackTrace.toString(),
                Snackbar.LENGTH_SHORT
            )
        }
    }

Создайте файл, в котором будут храниться фотографии

 @Throws(IOException::class)
    private fun createImageFile(): File {
        // Create an image file name
        val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss").format(Date())
        val storageDir: File? = requireContext().getExternalFilesDir(Environment.DIRECTORY_PICTURES)
        return File.createTempFile(
            "${callLoggingIdForAttachment}_${timeStamp}_", /* prefix */
            ".jpg", /* suffix */
            storageDir /* directory */
        )
    }

Вот URL-адрес библиотеки: https://github.com/ChiliLabs/ChiliPhotoPicker

1 Ответ

1 голос
/ 27 мая 2020

Ваша функция createImageFile() создает пустой файл, возвращая результат createTempFile, а не файл изображения. Вы ничего не записываете в этот пустой файл и не используете его как вложение. И в

// Get the file-name from the image-path
val destinationFilePath = it[index].absolutePath

вы не используете путь к изображению, как говорится в комментарии; вы используете путь к пустому файлу, который вы только что создали.

Файл изображения передается вам как Uri, e в

photos.forEachIndexed { index, e ->

, но вы игнорируете его, за исключением регистрации

println("$e at ${photos[index].path}")

Итак, преобразовать Uri в File

val destinationFile = File(e.path)

и работать с этим. Или скопируйте его в файл, созданный createImageFile, если это то, что вы хотите (ответы есть для Java, но IDEA / Android Studio может преобразовать их в Kotlin за вас).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...