Android студийное сохранение изображения на внешнее хранилище - PullRequest
0 голосов
/ 09 марта 2020

Итак, я создал функцию для сохранения фотографий в галерею с названием приложения, все работало просто отлично, я работал над другими вещами в приложении (которые не связаны с этой функцией) тогда, когда я хотел используйте эту функцию снова, она перестала работать, вот мой код

 fun saveImage(itemImage: View, activity: Activity) {
    var fileName: String
    val imageFromView = getBitmapFromView(itemImage)

    ByteArrayOutputStream().apply {
        Bitmap.createBitmap(imageFromView).compress(Bitmap.CompressFormat.JPEG, 100, this)
        fileName = UUID.nameUUIDFromBytes(this.toByteArray()).toString().replace("-", "")
    }

    val imageFile = File("${Environment.getExternalStorageDirectory().absolutePath}/ChatOut/$fileName.jpg/")
    val direct = File("${Environment.getExternalStorageDirectory().absolutePath}/ChatOut/").apply {
        if (!exists())
            mkdirs()
    }

    if (!imageFile.exists()) {
        File(direct, "$fileName.jpg").apply {
            FileOutputStream(this).apply {
                Bitmap.createBitmap(imageFromView).compress(Bitmap.CompressFormat.JPEG, 100, this)
                flush()
                close()
            }
        }.let {
            activity.contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                    ContentValues().apply {
                        put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis())
                        put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")
                        put(MediaStore.Images.Media.DATA, it.absolutePath)
                    }
            )
       }

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

эта функция проверяет, сохранено ли уже изображение или нет, если нет, то сохраняет его, я получаю

/storage/emulated/0/ChatOut/0fe4706621ce318fb4e7292e16bcfb17.jpg: open failed: ENOENT (No such file or directory)

У меня есть разрешение на использование в моем манифесте

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Я удостоверился, что разрешение также предоставлено.

по какой-то причине, независимо от того, что я делаю, mkdirs () возвращает false никогда не удается создать файл или каталог ...

Пожалуйста, помогите, и спасибо за ваше время.

1 Ответ

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

Я решил свою проблему, применив следующий код, на случай, если у кого-то еще возникла такая же проблема

fun saveImage(itemImage: View, activity: Activity) {
    val fileName: String
    val imageFromView = getBitmapFromView(itemImage)

    ByteArrayOutputStream().apply {
        imageFromView.compress(Bitmap.CompressFormat.JPEG, 100, this)
        fileName = UUID.nameUUIDFromBytes(this.toByteArray()).toString().replace("-", "")
    }

    val imageFile =  File("${activity.getExternalFilesDir(Environment.DIRECTORY_PICTURES)}/ChatOut/$fileName.jpg/")

    if (!imageFile.exists()) {

        val contentResolver = ContentValues().apply {
            put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis())
            put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")
            put(MediaStore.Images.Media.DATA, imageFile.absolutePath)
        }

         activity.contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentResolver).apply {
              imageFromView.compress(Bitmap.CompressFormat.JPEG, 100, activity.contentResolver.openOutputStream(this!!))
         }


        Toast.makeText(activity, "saved", Toast.LENGTH_SHORT).show()
     } else
        Toast.makeText(activity, "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)
        }
    }
}
...