• How to save image to real sdcard?

    From Jakub@21:1/5 to All on Thu Aug 3 11:12:25 2023
    Welcome

    I have this function to save image external storege. But only save to internal. How to fix this?


    fun saveBitmapToExternal(context: Context,
    bitmap: Bitmap,
    fileName: String,
    extension: String = "image/jpeg",
    compressFormat: Bitmap.CompressFormat = Bitmap.CompressFormat.JPEG,
    qualityCompress: Int = 100) {

    val date = System.currentTimeMillis()
    var bitmapSave: Boolean

    if ( Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q ) {
    val collection = MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)
    val dirDest = Environment.DIRECTORY_DCIM + "/jphoto"
    val directory = File(dirDest)
    if ( !directory.exists() ) {
    directory.mkdirs()
    }

    val newImage = ContentValues().apply {
    put(MediaStore.Images.Media.DISPLAY_NAME, fileName)
    put(MediaStore.MediaColumns.MIME_TYPE, extension)
    put(MediaStore.MediaColumns.DATE_ADDED, date)
    put(MediaStore.MediaColumns.DATE_MODIFIED, date)
    put(MediaStore.MediaColumns.SIZE, bitmap.byteCount)
    put(MediaStore.MediaColumns.WIDTH, bitmap.width)
    put(MediaStore.MediaColumns.HEIGHT, bitmap.height)
    put(MediaStore.MediaColumns.RELATIVE_PATH, dirDest)
    put(MediaStore.Images.Media.IS_PENDING, 1)
    }

    val newImageUri =
    context.contentResolver.insert(collection, newImage)

    context.contentResolver.openOutputStream(newImageUri!!,
    "w").use {
    bitmapSave = bitmap.compress(compressFormat,
    qualityCompress, it!!)
    }

    if ( bitmapSave ) {
    showSnackBar(resources.getString(R.string.photo_done), fontTextSize, Snackbar.LENGTH_SHORT, numberRow = 2)

    newImage.clear()

    newImage.put(MediaStore.Images.Media.IS_PENDING, 0)

    context.contentResolver.update(newImageUri, newImage,
    null, null)
    } else {
    context.contentResolver.delete(newImageUri, null, null)

    showSnackBar(resources.getString(R.string.photo_add_error),
    fontTextSize, Snackbar.LENGTH_SHORT, numberRow = 2)
    }
    } else {
    val directory = File(Environment.getExternalStorageDirectory().toString() + "/DCIM/jphoto")
    if ( !directory.exists() ) {
    directory.mkdirs()
    }

    val file = File(directory, fileName)
    val save = saveImageToStream03(bitmap,
    FileOutputStream(file), compressFormat, qualityCompress)

    if ( save ) {
    val values = ContentValues().apply {
    put(MediaStore.Images.Media.DISPLAY_NAME, fileName)
    put(MediaStore.MediaColumns.MIME_TYPE, extension)
    put(MediaStore.MediaColumns.DATE_ADDED, date)
    put(MediaStore.MediaColumns.DATE_MODIFIED, date)
    put(MediaStore.MediaColumns.SIZE, bitmap.byteCount)
    put(MediaStore.MediaColumns.WIDTH, bitmap.width)
    put(MediaStore.MediaColumns.HEIGHT, bitmap.height)
    put(MediaStore.Images.Media.DATA, file.absolutePath)
    }
    // .DATA is deprecated in API 29

    context.contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values)

    showSnackBar(resources.getString(R.string.photo_done), fontTextSize, Snackbar.LENGTH_SHORT, numberRow = 2)
    } else {
    if ( file.exists() ) {
    file.delete()
    }


    showSnackBar(resources.getString(R.string.photo_add_error),
    fontTextSize, Snackbar.LENGTH_SHORT, numberRow = 2)
    }
    }
    }

    private fun saveImageToStream03(
    bitmap: Bitmap,
    outputStream: OutputStream?,
    compressFormat: Bitmap.CompressFormat = Bitmap.CompressFormat.JPEG,
    qualityCompress: Int = 100
    ) : Boolean {
    var bitmapSave = false

    if ( outputStream != null ) {
    try {
    bitmapSave = bitmap.compress(compressFormat,
    qualityCompress, outputStream)

    outputStream.close()
    } catch ( _ : Exception ) {
    }
    }

    //outputStream.
    return bitmapSave
    }

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)