Storage Access Framework - Как добавить к созданному файлу, используя его URI? - PullRequest
1 голос
/ 10 июля 2019

Используя ответ в этом сообщении, я смог использовать OPEN_CREATE_DOCUMENT в качестве средства выбора папки, чтобы GDrive появился в списке. Код в этом ответе создает пустой файл. Теперь я пытаюсь добавить / записать в этот файл. Я пытался использовать DocumentFile и openFileDescriptor. Оба они терпят неудачу. Последний с исключением отказа в разрешении говорит, что мне нужно добавить MANAGE_DOCUMENTS или используйте uripermission (). Мы не можем использовать MANAGE_DOCUMENTS в манифесте, так как это системное разрешение, и я не нашел способа использовать uripermission (). Вот код:

 var new_file = DocumentsContract.createDocument(context.contentResolver ,path,"audio/mp3",file)

 contentresolve.openFileDescriptor(new_file, "w")?.use {
                val pathToNewFile = FileOutputStream(it.fileDescriptor)
            val inFile = context.openFileInput(file).readBytes()
            context.openFileOutput(file, Context.MODE_PRIVATE).use {
                pathToNewFile.write(inFile)
            }
            File(absolutePath + File.separator + file).delete()
        }

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

folderPicker = Intent(Intent.ACTION_CREATE_DOCUMENT)
folderPicker.addFlags(
Intent.FLAG_GRANT_READ_URI_PERMISSION
       or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
       or Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
       )
folderPicker.setType("vnd.android.document/directory")
startActivityForResult(folderPicker, READ_REQUEST_BY_USER)

И это результат деятельности:

            override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
            super.onActivityResult(requestCode, resultCode, resultData)
            if (requestCode == READ_REQUEST_BY_USER && resultCode == Activity.RESULT_OK) {
                resultData?.data?.also { uri ->
                    val takeFlags: Int = folderPicker.flags and (Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
                    activity!!.contentResolver!!.persistedUriPermissions.forEach {
                        activity!!.contentResolver!!.releasePersistableUriPermission(it.uri, takeFlags)
                    }
                    activity!!.contentResolver!!.takePersistableUriPermission(uri, takeFlags)
                    val sharedPref = PreferenceManager.getDefaultSharedPreferences(activity?.baseContext)
                    with (sharedPref.edit()) {
                        putString("savePathURI", uri.toString())
                        putString("saveAuthority", uri.authority)
                        commit()
                    }
                }
            }
        }

1 Ответ

0 голосов
/ 13 июля 2019

Так как это может занять вечность, я решил использовать REST API Google Drive v3, чтобы удовлетворить свои потребности.Я добавил еще одну запись в меню моего приложения, предлагая пользователю выбрать путь к диску Google.

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

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

Работает довольно хорошо, но мне не понравился тот факт, что мне нужна вторая запись в настройках и что мне нужно 3 дня, чтобы закодировать все это с нуля.

...