Я написал код, который должен копировать файл, выбранный из Storage Access Framework , и вставлять их в личный каталог моего приложения.Но некоторые файлы не могут быть созданы и скопированы.
Как работает код
Работа по копированию / вставке и созданию файла выполняется фоновым потоком, который я создал,
Запускаемый класс подается с клипом (ClipData), полученным от SAF
Thread is start ()
Цикл for внутри класса Runnable перемещается по клипу с использованием индексов
На первой итерации тип файла определяется и отправляется в функцию createPrivateFile () .
Функция выплевывает файл с указанным расширением, и для него устанавливается переменная pickFile .
openOutputStream() открывает поток с созданным файлом URI
openInputStream () передается с URI клипа.
Байты из inputStream передаются в файл с помощью byteArray .
К сожалению, в моем случае у меня не так много вариантов, чтобы выбрать,Я искал проблему в течение 2 дней безуспешно.
class AttachmentReceiverRunnable internal constructor(private val clip: ClipData, context: Context) : Runnable {
private val weakContextReference = WeakReference(context)
private var progressUpdater: ProgressBarResultPublisher? = context as ProgressBarResultPublisher
override fun run() {
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)
val context = weakContextReference.get()
val actualProgress: Int = 100 / clip.itemCount
var clipSize = clip.itemCount
val clipCount = (clip.itemCount) - 1
var lastProgress = 0
val contentResolver: ContentResolver = context!!.contentResolver
for (item: Int in 0 until clipCount) {
val clipItem = clip.getItemAt(item)
val fileType = contentResolver.getType(clipItem.uri)
val extension = fileType!!.substringAfter("/")
Log.d("FILE TYPE", extension)
val pickedFile = createPrivateFile(extension)
if(pickedFile.createNewFile())
Log.d("FILE CREATION","SUCCESFUL")
else
Log.d("FILE CREATION"," NOT SUCCESFUL")
val fileContentURI = FileProvider.getUriForFile(context, "com.minutecodes.openote.fileprovider", pickedFile)
val out = contentResolver.openOutputStream(fileContentURI)
val inStream = contentResolver.openInputStream(clipItem!!.uri)
val byteArray: ByteArray = inStream!!.readBytes()
pickedFile.writeBytes(byteArray)
lastProgress += actualProgress
progressUpdater!!.onProgressUpdate(lastProgress, clipSize)
clipSize -= 1
out!!.flush()
out.close()
inStream.close()
}
return
}
@SuppressLint("SimpleDateFormat")
@Throws(IOException::class)
private fun createPrivateFile(fileExtension: String): File {
val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss").format(System.currentTimeMillis())
@Suppress("JoinDeclarationAndAssignment") val storageDir: File?
val newFile: File?
var extension: String = fileExtension
if (fileExtension == "plain")
extension = "txt"
storageDir = weakContextReference.get()!!.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS)
if (!storageDir!!.exists())
storageDir.mkdirs()
newFile = File(storageDir,"FILE_$timeStamp.$extension")
return newFile
}
}
Ожидаемый результат: Если выбрано 6 файлов, шесть файлов должны быть созданы и снабжены byteArray.
Фактический результат: Если выбрано 6 файлов, часто создаются 3 файла, поэтому копируются только 3 выбранных файла.Если выбрано 20 файлов, копируется около 11-13 файлов.
К сожалению, согласованность не всегда достигается и копируется произвольное количество выбранных файлов.
Насколько я тестировал,проблема заключается в создании файла, а не в его копировании.
Logcat
2019-03-23 18:14:53.932 19579-19666/com.minutecodes.openote D/FOR LOOP RUNNING: 0
2019-03-23 18:14:53.951 19579-19666/com.minutecodes.openote D/FILE TYPE: jpeg
2019-03-23 18:14:53.963 19579-19666/com.minutecodes.openote D/FILE CREATION: SUCCESFUL
2019-03-23 18:14:54.001 19579-19666/com.minutecodes.openote D/FOR LOOP RUNNING: 1
2019-03-23 18:14:54.009 19579-19666/com.minutecodes.openote D/FILE TYPE: aac
2019-03-23 18:14:54.016 19579-19666/com.minutecodes.openote D/FILE CREATION: SUCCESFUL
2019-03-23 18:14:54.133 19579-19666/com.minutecodes.openote D/FOR LOOP RUNNING: 2
2019-03-23 18:14:54.137 19579-19666/com.minutecodes.openote D/FILE TYPE: aac
2019-03-23 18:14:54.142 19579-19666/com.minutecodes.openote D/FILE CREATION: NOT SUCCESFUL
2019-03-23 18:14:54.195 19579-19666/com.minutecodes.openote D/FOR LOOP RUNNING: 3
2019-03-23 18:14:54.197 19579-19666/com.minutecodes.openote D/FILE TYPE: mpeg
2019-03-23 18:14:54.201 19579-19666/com.minutecodes.openote D/FILE CREATION: SUCCESFUL
2019-03-23 18:14:54.251 19579-19666/com.minutecodes.openote D/FOR LOOP RUNNING: 4
2019-03-23 18:14:54.257 19579-19666/com.minutecodes.openote D/FILE TYPE: aac
2019-03-23 18:14:54.263 19579-19666/com.minutecodes.openote D/FILE CREATION: NOT SUCCESFUL
Следующий Logcat был захвачен при выборе 6 элементов.Как видите, иногда создание файла не удается, и, следовательно, я не могу копировать файлы.