Как создать файл из каталога, который вы сохранили как URIAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как создать файл из каталога, который вы сохранили как URI

Сообщение Anonymous »

С моим приложением я позволяю своим пользователям загружать изображения у других пользователей, и я пытаюсь позволить им выбрать место сохранения. В настоящее время я позволяю им выбрать место сохранения, используя следующее намерение: < /p>
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE).apply {
Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
putExtra(DocumentsContract.EXTRA_INITIAL_URI, pickerInitialUri)
}
< /code>
, который я затем сохраняю в своих SharedPreferences в формате строки, используя следующий код: < /p>
suspend fun setSaveLocationUri(p0: Context, saveUri: Uri) {
val savePath = stringPreferencesKey("save_path_uri")
p0.dataStore.edit { settings ->
settings[savePath] = saveUri.toString()
}
}
< /code>
, а затем еще раз восстановите URI, используя следующий код: < /p>
fun getSaveLocationUri(p0: Context): Uri {
val savePath = stringPreferencesKey("save_path_uri")
val flow: Flow = p0.dataStore.data.map { preferences ->
preferences[savePath] ?: "NOT SET"
}

val saveUriString: String
runBlocking(Dispatchers.IO) {
saveUriString = flow.first()
}

return if (saveUriString != "NOT SET") {
Uri.parse(saveUriString)
} else {
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toUri()
}
}
< /code>
Здесь я уверен, что если они еще не выбрали каталог, я вместо этого использую каталог изображений по умолчанию.
Я сейчас пытаюсь создать файл, но у меня есть некоторые неприятности с этим. Данные, которые я хочу сохранить, будут изображением или GIF, они могут быть типа: GIF, PNG, JPG и WEBP. У меня есть данные для изображения, которые необходимо сохранить в форме байтона.
К сожалению, я не могу понять, как сохранить эти файлы. Одним из методов, которые я пытался использовать, был DocumentFiles, однако мне не удалось заставить их работать. Вот самый последний подход, который я попробовал: < /p>
val fileNameArr = fullFileName.split(".")
val fileName = fileNameArr[0]

val directory = DocumentFile.fromTreeUri(this, DataStoreHandler.getSaveLocationUri(this))
var newFile = when (fileNameArr.last()) {
"png" -> directory!!.createFile("image/png", fileName)
"webp" -> directory!!.createFile("image/webp", fileName)
"jpg" -> directory!!.createFile("image/jpeg", fileName)
"jpeg" -> directory!!.createFile("image/jpeg", fileName)
"gif" -> directory!!.createFile("image/gif", fileName)
else -> TODO()
}
if (newFile == null) {
newFile = directory.findFile(fileName + fileNameArr.last())
}
if (newFile == null) {
Log.e("doc", "somehow it still failed help")
}
val out = FileOutputStream(newFile!!.uri.path)
out.write(bytes)
MediaScannerConnection.scanFile(
this, arrayOf(newFile.uri.path),
null
) { path, uri ->
Toast.makeText(this, "saved", Toast.LENGTH_SHORT).show()
}
< /code>
В этом примере 'fullfilename' было бы именем, которое файл должен иметь с расширением (например, NICE_IMAGE.PNG), а «байты» - это байты, которые необходимо сохранить в файле. При этом у меня есть проблема, что файлы не создаются при использовании CreateFile, вместо этого он просто возвращает NULL. Я читал где -то еще, что с некоторыми телефонами это иногда делает это, но на самом деле он создал файл, следовательно, небольшой бит кода для 'if (newfile == null)'

Подробнее здесь: https://stackoverflow.com/questions/794 ... d-as-a-uri
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»