Skip to content

Instantly share code, notes, and snippets.

@root-ansh
Created September 7, 2025 10:49
Show Gist options
  • Select an option

  • Save root-ansh/ec60f7535ae85323ffc37068c8f6c4bf to your computer and use it in GitHub Desktop.

Select an option

Save root-ansh/ec60f7535ae85323ffc37068c8f6c4bf to your computer and use it in GitHub Desktop.
@Throws
suspend fun Context.saveFileToUserMemory(
sourceFile: File,
targetDirectory: String = Environment.DIRECTORY_DOWNLOADS
): Uri {
return withContext(Dispatchers.IO){
if (!sourceFile.exists()) error("Source file does not exist")
if(Build.VERSION.SDK_INT<Build.VERSION_CODES.Q) error("Saving to public directories is only supported on Android Q and above")
val extension = sourceFile.extension.lowercase()
val mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension) ?: "application/octet-stream"
val values = ContentValues().apply {
put(MediaStore.Downloads.DISPLAY_NAME, sourceFile.name)
put(MediaStore.Downloads.MIME_TYPE, mimeType)
put(MediaStore.Downloads.RELATIVE_PATH, targetDirectory)
put(MediaStore.Downloads.IS_PENDING, 1)
}
val resolver = contentResolver
val uri = resolver.insert(MediaStore.Downloads.EXTERNAL_CONTENT_URI, values)!!
saveFileToUserSelectedPath(uri,sourceFile)
values.clear()
values.put(MediaStore.Downloads.IS_PENDING, 0)
resolver.update(uri, values, null, null)
uri
}
}
suspend fun Context.saveBitmapToUserMemory(
bitmap: Bitmap,
targetDirectory: String = Environment.DIRECTORY_DOWNLOADS,
): Uri {
return withContext(Dispatchers.IO){
if(Build.VERSION.SDK_INT<Build.VERSION_CODES.Q) error("Saving to public directories is only supported on Android Q and above")
val values = ContentValues().apply {
put(MediaStore.Downloads.DISPLAY_NAME, "${System.currentTimeMillis()}.png")
put(MediaStore.Downloads.MIME_TYPE, "image/png")
put(MediaStore.Downloads.RELATIVE_PATH, targetDirectory)
put(MediaStore.Downloads.IS_PENDING, 1)
}
val resolver = contentResolver
val uri: Uri = resolver.insert(MediaStore.Downloads.EXTERNAL_CONTENT_URI, values)!!
saveBitmapToUserSelectedPath(uri,bitmap)
values.clear()
values.put(MediaStore.Downloads.IS_PENDING, 0)
resolver.update(uri, values, null, null)
uri
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment