Android Изменение названия альбома сохраненных изображений. - PullRequest
0 голосов
/ 21 марта 2020

Я пытаюсь сохранить изображения в альбом с именем приложения внутри галереи, пока мне удалось сохранить изображение в галерее, но проблема в том, что имя альбома всегда "Изображения", я проверил все из других постов там и ничего у меня не получалось ...

вот мой код

val fileName = "abc"
val ImageToSave /*the image that I save, I send it value through method*/

val imageDir = File(activity.getExternalFilesDir(Environment.DIRECTORY_PICTURES),"appName")
val image = File(imageDir,fileName)

if (!imageDir.exists())
    imageDir.mkdirs()

val contentValues = ContentValues()
contentValues.put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis())
contentValues.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")
contentValues.put(MediaStore.Images.Media.DATA, image.absolutePath)
contentValues.put(MediaStore.Images.Media.DISPLAY_NAME, fileName)
contentValues.put(MediaStore.Images.Media.BUCKET_DISPLAY_NAME, "appName")

val url = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)!!
val out = contentResolver.openOutputStream(url)

imageFromView.compress(Bitmap.CompressFormat.JPEG, 100, out)

Toast.makeText(activity, "saved", Toast.LENGTH_SHORT).show()

Я сохраняю изображение без проблем, я просто хочу изменить название альбома. заранее спасибо ...

ОБНОВЛЕНИЕ

Я пытался просто создать файл изображения без contentValue, но кажется, что что-то не так с файлом, который я продолжаю получать ошибка, которая говорит: «Файл не существует», вот мой код сейчас

val imageDir = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "appName")

if (!imageDir.exists())
    imageDir.mkdirs()

val image = File(imageDir, fileName)

if (!image.exists()) {

    val out = FileOutputStream(image)
    ImageToSave.compress(Bitmap.CompressFormat.JPEG, 100, out)

    Toast.makeText(activity, "saved", Toast.LENGTH_SHORT).show()
} else
    Toast.makeText(activity, "Already saved", Toast.LENGTH_SHORT).show()

также, я удостоверился, что у меня есть разрешение запроса в моем файле манифеста, и я спрашиваю разрешение, когда пользователь нажимает на кнопку ... я убедился, что мое приложение имеет разрешение на чтение и запись в файлы ....

Ответы [ 2 ]

0 голосов
/ 22 марта 2020

После долгих исследований я смог найти решение для своей проблемы, все, что мне нужно было сделать, это добавить

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)
        }
     }
}

Я надеюсь, что это помогает другим :) хорошо провести время!

0 голосов
/ 21 марта 2020

Это потому, что вы используете Environment.DIRECTORY_PICTURES

Вместо этого вы должны создать пользовательский каталог, вот пример:

String path = Environment.getExternalStorageDirectory().toString();
                File appDirectory = new File(path + "/" + "FolderName");  
                appDirectory.mkdirs();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...