还有其他人发现作用域存储几乎不可能使其正常工作吗?lol。
我一直在尝试了解如何允许用户授予我的应用程序写入权限,以编辑应用程序文件夹外的文本文件。(比方说允许用户编辑他们“文档”文件夹中文件的文本)。我已经设置好了MANAGE_EXTERNAL_STORAGE
权限,并可以确认应用程序具有该权限。但每次尝试时仍然会遇到问题。
val fileDescriptor = context.contentResolver.openFileDescriptor(uri, "rwt")?.fileDescriptor
我遇到了 Illegal Argument: Media is read-only
错误。
我的清单文件(Manifest)请求了以下三个权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
我也尝试使用传统存储方式:
<application
android:allowBackup="true"
android:requestLegacyExternalStorage="true"
但仍然遇到了只读问题。
我错过了什么吗?
额外说明
我如何获取URI:
view?.selectFileButton?.setOnClickListener {
val intent =
Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
type = "*/*"
flags = Intent.FLAG_GRANT_READ_URI_PERMISSION or
Intent.FLAG_GRANT_WRITE_URI_PERMISSION
}
startActivityForResult(Intent.createChooser(intent, "Select a file"), 111)
}
接着
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == 111 && resultCode == AppCompatActivity.RESULT_OK && data != null) {
val selectedFileUri = data.data;
if (selectedFileUri != null) {
viewModel.saveFilename(selectedFileUri.toString())
val contentResolver = context!!.contentResolver
val takeFlags: Int = Intent.FLAG_GRANT_READ_URI_PERMISSION or
Intent.FLAG_GRANT_WRITE_URI_PERMISSION
contentResolver.takePersistableUriPermission(selectedFileUri, takeFlags)
view?.fileName?.text = viewModel.filename
//TODO("if we didn't get the permissions we needed, ask for permission or have the user select a different file")
}
}
}
uri
是从哪里来的?请注意,MANAGE_EXTERNAL_STORAGE
适用于 Android 11+(而不是 Android 10)。 - CommonsWare