Несколько файлов не копируются в локальный каталог в Android

#android #android-studio #kotlin

#Android #android-studio #kotlin

Вопрос:

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

     private fun sendImages(uriString: String, messageBody: String, uriList: ArrayList<Uri>) {

    val pathList = mutableListOf<String>()
    val fileNameList = mutableListOf<String>()
    var fieSize = 0
    var multiSize = 0

    if(uriList.isEmpty() amp;amp; uriString.isNotEmpty())
        uriList.add(Uri.parse(uriString))

        val localId: String = "localId"

        for(i in 0 until uriList.size) {
          val uri  = uriList[i]
          val path = FileUtils.getPath(application, uri)!!
          val fullName = path.substring(path.lastIndexOf("/")   1)
          val  name = "some function call that returns unique name for file"

          val file = File(requireActivity().applicationContext.filesDir, localId   name)
          file.createNewFile()
         
          var bitmapdata: ByteArray? = null
          var inputStream: InputStream? = null

            try {
                val ei = ExifInterface(path)
                val orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED)
                var bitmap: Bitmap? = null
                bitmap = if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) {
                    ImageDecoder.decodeBitmap(ImageDecoder.createSource(requireActivity().applicationContext.contentResolver, uri))
                }
                else MediaStore.Images.Media.getBitmap(requireActivity().applicationContext.contentResolver, uri)
                val newBitmap = FunctionUtil.rotateImage(bitmap, orientation)
                bitmapdata = FileUtils.getCompressedBitmapForUpload(newBitmap!!)
                FunctionUtil.recycleBitmap(newBitmap)
            } catch (e: Exception) {
               return
            }
        }

        requireActivity().applicationContext.openFileOutput(file.name, Context.MODE_PRIVATE).use {
            it.write(bitmapdata)
        }


        val localPath = FunctionUtil.getMediaStorePath(requireActivity().application)

        val completePath = requireActivity().application.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)!!

       var  outFile =File(localPath "/" file.name)
        org.apache.commons.io.FileUtils.copyFile(file,outFile)
        Logger.log("PATH ${ outFile.absolutePath}  ${ outFile.path}")
        pathList.add(outFile.absolutePath)
        fileNameList.add(file.name)
        
     //... Do something with this data
    }
   } 
  

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

Я не могу найти, в чем проблема. Пожалуйста, помогите

Комментарии:

1.Избавиться от FileUtils.getPath() . Используйте Uri и ContentResolver openInputStream() , чтобы получить InputStream значение, которое вы можете использовать для копирования содержимого.

2. @CommonsWare работает нормально при копировании одного файла. Но при копировании нескольких файлов копируется только последнее изображение в списке. Для хранения мы используем область применения.

3.Привет @CommonsWare Тот же результат с ContentResolver openInputStream() . Когда я пытаюсь получить доступ к файлу, я выдал ошибку Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory)

Ответ №1:

Некоторые телефоны Android столкнутся с такой проблемой: файл существует, но ‘fd’, возвращаемый методом ‘c open ()’, равен -1, а ‘strerror’ показывает ‘Нет такого файла или каталога».

Телефоны, с которыми я столкнулся, следующие:

vivo
V2055A V2073A V2241A
huawei
GIA-AN00 JLH-AN00 CMA-AN00 HPB-AN00 NTN-AN20 CMA-AN40
oppo
LE2110


В исходном коде системы Android также можно обнаружить подобное явление :

введите описание изображения здесь

Приведенный выше комментарий добавлен в 2017 году, и записываются только общие форматы «bmp» и «ico».
В face эта проблема также возникает с изображениями в формате heif / heic.


Наконец,
использование FileInputStream будет в порядке.