Кто-нибудь еще считает, что хранилище с ограниченным объемом памяти практически невозможно приступить к работе? ржу не могу.
Я пытался понять, как разрешить пользователю давать моему приложению права на запись в текстовый файл вне папки приложения. (Скажем, разрешить пользователю редактировать текст файла в своей папке «Документы»). У меня есть 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_STORAGE
для Android 11+ (не Android 10). - person CommonsWare   schedule 04.10.2020