So one of the functionalities of the prototype app I'm making allows the user to create a recipe and add a thumbnail and video to it. Once a user has selected an image from their gallery for the thumbnail and a video, how and where should I store it so that it can be retrieved whenever the recipe is viewed again?
CodePudding user response:
Here is the code to store an image in the DCIM/ directory
@Throws(IOException::class)
private fun saveImage(bitmap: Bitmap, name: String) {
val saved: Boolean
val fos: OutputStream?
fos = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
val resolver: ContentResolver = requireActivity().contentResolver
val contentValues = ContentValues()
contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, name)
contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/png")
contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, "DCIM/$IMAGE_DIRECTORY")
val imageUri =
resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)
resolver.openOutputStream(imageUri!!)
} else {
val imagesDir = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DCIM
).toString() File.separator IMAGE_DIRECTORY
val file = File(imagesDir)
if (!file.exists()) {
file.mkdir()
}
val image = File(imagesDir, "$name.png")
FileOutputStream(image)
}
saved = bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos)
fos!!.flush()
fos.close()
}
Then get all the images as a list of URI like so
private fun getAllImages(): List<Uri>
{
val allImages = mutableListOf<Uri>()
val imageProjection = arrayOf(
MediaStore.Images.Media._ID
)
val imageSortOrder = "${MediaStore.Images.Media.DATE_ADDED} DESC"
val cursor = activity?.contentResolver?.query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
imageProjection,
null,
null,
imageSortOrder
)
cursor.use {
if (cursor != null)
{
val idColumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID)
while (cursor.moveToNext())
{
allImages.add(
ContentUris.withAppendedId(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
cursor.getLong(idColumn)
)
)
}
}
else
{
Log.d("AddViewModel", "Cursor is null!")
}
}
return allImages
}
Then query it to find the required image