#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 будет в порядке.