Created
September 7, 2025 10:49
-
-
Save root-ansh/ec60f7535ae85323ffc37068c8f6c4bf to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| @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