There are 2 methods, but first, I’ll define the file and directory name, which I will later save inside the external (sdcard) Downloads folder
val outputFilename = "my_file" val outputDirectory = "my_sub_directory" // The folder within the Downloads folder, because we use `DIRECTORY_DOWNLOADS`
The working, but deprecated method:
Environment.getExternalStoragePublicDirectory was deprecated, it still works on apps targeting and running on Android 11.
file = File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_DOCUMENTS), "$outputDirectory/$outputFilename" ) val outputStream = FileOutputStream(file)
The MediaStore way:
I rewrote it in kotlin and modified it for writing files here:
val resolver = context.contentResolver val values = ContentValues() // save to a folder values.put(MediaStore.MediaColumns.DISPLAY_NAME, outputFilename) values.put(MediaStore.MediaColumns.MIME_TYPE, "application/my-custom-type") values.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS + "/" + outputDirectory) val uri = resolver.insert(MediaStore.Files.getContentUri("external"), values) // You can use this outputStream to write whatever file you want: val outputStream = resolver.openOutputStream(uri!!) // Or alternatively call other methods of ContentResolver, e.g. .openFile
In both cases below, you don’t need
WRITE_EXTERNAL_STORAGE for Android 29 and above.
CLICK HERE to find out more related problems solutions.