Ошибка при создании и копировании выбранных файлов - PullRequest
0 голосов
/ 23 марта 2019

Я написал код, который должен копировать файл, выбранный из Storage Access Framework , и вставлять их в личный каталог моего приложения.Но некоторые файлы не могут быть созданы и скопированы.

Как работает код

Работа по копированию / вставке и созданию файла выполняется фоновым потоком, который я создал,

  1. Запускаемый класс подается с клипом (ClipData), полученным от SAF

  2. Thread is start ()

  3. Цикл for внутри класса Runnable перемещается по клипу с использованием индексов

  4. На первой итерации тип файла определяется и отправляется в функцию createPrivateFile () .

  5. Функция выплевывает файл с указанным расширением, и для него устанавливается переменная pickFile .

  6. openOutputStream() открывает поток с созданным файлом URI

  7. openInputStream () передается с URI клипа.

  8. Байты из 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 элементов.Как видите, иногда создание файла не удается, и, следовательно, я не могу копировать файлы.

...