#1250 - Save images not being stored correctly

This commit is contained in:
Moez Bhatti
2018-07-19 02:08:23 -04:00
parent 63e3ff2444
commit 892b18c844
@@ -1,19 +1,20 @@
package com.moez.QKSMS.repository
import android.content.ContentResolver
import android.content.ContentUris
import android.content.ContentValues
import android.content.Context
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Matrix
import android.media.MediaScannerConnection
import android.net.Uri
import android.provider.MediaStore
import android.provider.MediaStore.Images
import android.os.Environment
import androidx.exifinterface.media.ExifInterface
import com.moez.QKSMS.util.tryOrNull
import java.io.File
import java.io.FileNotFoundException
import java.io.FileOutputStream
import java.io.IOException
import javax.inject.Inject
class ImageRepostoryImpl @Inject constructor(private val context: Context) : ImageRepository {
override fun loadImage(uri: Uri): Bitmap? {
@@ -41,101 +42,25 @@ class ImageRepostoryImpl @Inject constructor(private val context: Context) : Ima
}
override fun saveImage(uri: Uri) {
val bitmap = tryOrNull { MediaStore.Images.Media.getBitmap(context.contentResolver, uri) }
var title = ""
var description = ""
when (uri.scheme) {
"file" -> title = uri.lastPathSegment
"content" -> {
val projection = arrayOf(Images.Media.TITLE, Images.Media.DESCRIPTION)
context.contentResolver.query(uri, projection, null, null, null)?.use { cursor ->
if (cursor.moveToFirst()) {
title = cursor.getString(0)
description = cursor.getString(1)
}
}
}
}
insertImage(context.contentResolver, bitmap, title, description)
}
/**
* Modified from [android.provider.MediaStore.Images.Media.insertImage] to add date fields so
* that the saved image is put at the start of the gallery
*/
private fun insertImage(cr: ContentResolver, source: Bitmap?, title: String, description: String): String? {
val values = ContentValues()
values.put(Images.Media.TITLE, title)
values.put(Images.Media.DISPLAY_NAME, title)
values.put(Images.Media.DESCRIPTION, description)
values.put(Images.Media.MIME_TYPE, "image/jpeg")
// Add the date meta data to ensure the image is added at the front of the gallery
values.put(Images.Media.DATE_ADDED, System.currentTimeMillis() / 1000)
values.put(Images.Media.DATE_TAKEN, System.currentTimeMillis())
var uri: Uri? = null
val type = context.contentResolver.getType(uri)?.split("/") ?: return
val dir = File(Environment.getExternalStorageDirectory(), "QKSMS").apply { mkdirs() }
val file = File(dir, "${type.first()}${System.currentTimeMillis()}.${type.last()}")
try {
uri = cr.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values)
val outputStream = FileOutputStream(file)
val inputStream = context.contentResolver.openInputStream(uri)
if (source != null) {
cr.openOutputStream(uri).use { imageOut ->
source.compress(Bitmap.CompressFormat.JPEG, 100, imageOut)
}
inputStream.copyTo(outputStream, 1024)
val id = ContentUris.parseId(uri)
// Wait until MINI_KIND thumbnail is generated.
val miniThumb = Images.Thumbnails.getThumbnail(cr, id, Images.Thumbnails.MINI_KIND, null)
// This is for backward compatibility.
storeThumbnail(cr, miniThumb, id, 50f, 50f, Images.Thumbnails.MICRO_KIND)
} else {
cr.delete(uri, null, null)
uri = null
}
} catch (e: Exception) {
if (uri != null) {
cr.delete(uri, null, null)
uri = null
}
inputStream.close()
outputStream.close()
} catch (e: FileNotFoundException) {
e.printStackTrace()
} catch (e: IOException) {
e.printStackTrace()
}
return uri?.toString()
}
/**
* Modified from [android.provider.MediaStore.Images.Media.insertImage] to add date fields so
* that the saved image is put at the start of the gallery
*/
private fun storeThumbnail(cr: ContentResolver, source: Bitmap, id: Long, width: Float, height: Float, kind: Int): Bitmap? {
val matrix = Matrix()
val scaleX = width / source.width
val scaleY = height / source.height
matrix.setScale(scaleX, scaleY)
val thumb = Bitmap.createBitmap(source, 0, 0, source.width, source.height, matrix, true)
val values = ContentValues(4)
values.put(Images.Thumbnails.KIND, kind)
values.put(Images.Thumbnails.IMAGE_ID, id.toInt())
values.put(Images.Thumbnails.HEIGHT, thumb.height)
values.put(Images.Thumbnails.WIDTH, thumb.width)
val url = cr.insert(Images.Thumbnails.EXTERNAL_CONTENT_URI, values)
return tryOrNull {
val thumbOut = cr.openOutputStream(url)
thumb.compress(Bitmap.CompressFormat.JPEG, 100, thumbOut)
thumbOut.close()
thumb
}
MediaScannerConnection.scanFile(context, arrayOf(file.path), null, null)
}
}