После долгих исследований я смог найти решение для своей проблемы, все, что мне нужно было сделать, это добавить
put(MediaStore.Images.Media.RELATIVE_PATH, "Pictures/AppName/")
, это создаст папку с именем вашего приложения внутри папки с картинками, в галерее он появится с именем приложения, которое вы ввели ... для дополнительной информации прочитайте эту ссылку
Я обнаружил, что огромный кусок кода, который я написал, не нужен Я закончил тем, что удалил все лишние вещи, это конечный результат
ОБНОВЛЕНИЕ
Я обновил код, чтобы он работал со старыми версиями android также
fun saveImage(itemImage: View, context: Context) {
val imageName: String
val imageToSave = getBitmapFromView(itemImage)
val exists: Boolean
ByteArrayOutputStream().apply {
imageToSave.compress(Bitmap.CompressFormat.JPEG, 100, this)
imageName = "ChatOut_" + UUID.nameUUIDFromBytes(this.toByteArray()).toString().replace("-", "") + ".jpg"
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){
context.contentResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,arrayOf(MediaStore.Images.Media.DISPLAY_NAME), "${MediaStore.Images.Media.DISPLAY_NAME} = '$imageName' ", null, MediaStore.Images.ImageColumns.DATE_ADDED + " DESC").let {
exists = it?.count ?: 0 >= 1
it?.close()
}
if (!exists) {
val contentValues = ContentValues().apply {
put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis())
put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")
put(MediaStore.Images.Media.DISPLAY_NAME, imageName)
put(MediaStore.Images.Media.RELATIVE_PATH, "Pictures/ChatOut/")
}
val url = context.contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)!!
val out = context.contentResolver.openOutputStream(url)
imageToSave.compress(Bitmap.CompressFormat.JPEG, 100, out)
Toast.makeText(context, "saved", Toast.LENGTH_SHORT).show()
} else
Toast.makeText(context, "Already saved", Toast.LENGTH_SHORT).show()
}else{
val imageDir = File("${Environment.getExternalStorageDirectory()}/ChatOut/")
if (!imageDir.exists())
imageDir.mkdirs()
val image = File(imageDir,imageName)
if (!image.exists()){
val outputStream = FileOutputStream(image)
imageToSave.compress(Bitmap.CompressFormat.JPEG, 100, outputStream)
outputStream.close()
val contentValues = ContentValues().apply {
put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis())
put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")
put(MediaStore.Images.Media.DISPLAY_NAME, imageName)
put(MediaStore.Images.Media.DATA, image.absolutePath)
}
context.contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)
Toast.makeText(context, "saved", Toast.LENGTH_SHORT).show()
}else{
Toast.makeText(context, "Already saved", Toast.LENGTH_SHORT).show()
}
}
}
fun getBitmapFromView(view: View): Bitmap {
return Bitmap.createBitmap(view.width, view.height, Bitmap.Config.ARGB_8888).apply {
Canvas(this).apply {
view.draw(this)
}
}
}
Я надеюсь, что это помогает другим :) хорошо провести время!