使用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()
}
}
}
}
答案 0 :(得分:0)
由于这可能需要永久解决,因此我最终使用了Google Drive的REST API v3,以满足我的需求。我在应用程序菜单中添加了另一个条目,邀请用户选择Google驱动器路径。
我创建了一个带有recyclerview的新活动,该活动可以获取所有文件夹。然后,我在每个文件夹下添加了一个按钮,允许用户将其选择为他/她所需的文件夹。然后,我在单击按钮时将文件夹ID保存在sharedprefences中。
当需要上传文件时,我创建了一个新的API create()请求,并使用保存的文件夹ID作为即将上传的文件的父级。
效果很好,但我不喜欢我需要在设置中输入第二个条目,并且需要3天才能从头开始编写所有代码的事实。