存储访问框架-如何使用其URI附加到创建的文件?

时间:2019-07-10 07:48:04

标签: android kotlin storage-access-framework

使用this帖子中的答案,我能够将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 :(得分:0)

由于这可能需要永久解决,因此我最终使用了Google Drive的REST API v3,以满足我的需求。我在应用程序菜单中添加了另一个条目,邀请用户选择Google驱动器路径。

我创建了一个带有recyclerview的新活动,该活动可以获取所有文件夹。然后,我在每个文件夹下添加了一个按钮,允许用户将其选择为他/她所需的文件夹。然后,我在单击按钮时将文件夹ID保存在sharedprefences中。

当需要上传文件时,我创建了一个新的API create()请求,并使用保存的文件夹ID作为即将上传的文件的父级。

效果很好,但我不喜欢我需要在设置中输入第二个条目,并且需要3天才能从头开始编写所有代码的事实。