【发布时间】:2020-12-13 09:57:47
【问题描述】:
还有其他人发现范围存储几乎不可能开始工作吗?哈哈。
我一直在尝试了解如何允许用户向我的应用授予对应用文件夹之外的文本文件的写入权限。 (假设允许用户在其 Documents 文件夹中编辑文件的文本)。我已经设置了MANAGE_EXTERNAL_STORAGE 权限,并且可以确认该应用程序具有该权限。但还是每次尝试
val fileDescriptor = context.contentResolver.openFileDescriptor(uri, "rwt")?.fileDescriptor
我收到Illegal Argument: Media is read-only 错误。
我的清单请求这三个权限:
<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_STORAGEis for Android 11+(不是 Android 10)。 -
很高兴知道@CommonsWare! Fwiw,我正在针对运行 SDK 30 的手机运行代码。刚刚更新了问题以添加获取 URI 的代码。感谢您的帮助!
-
请在此链接中查看这种方式,它可能很有用。 stackoverflow.com/a/67140033/12272687
标签: android kotlin android-10.0 android-11 scoped-storage