如何在 kotlin 中将照片添加到 android 内置图库?

How to add a photo to android built-in Gallery in kotlin?

在我的应用程序中,我拍了一张照片(在一个片段中),然后我试图将它保存到图库中。当我去画廊时,它不在那里。它只保留在应用程序文件夹中。我正在关注 android 文档。其他一切正常。

我已经尝试过文档中的这段代码,但 ACTION_MEDIA_SCANNER_SCAN_FILE 已被弃用。而且我找不到任何未弃用或低于 API 25.

的替代品
   private fun galleryAddPic() {
        val mediaScanIntent = Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE)
        val f: File = File(myPath)
        val contentUri = Uri.fromFile(f)
        mediaScanIntent.data = contentUri
        requireContext().sendBroadcast(mediaScanIntent)
        Toast.makeText(requireContext(), "Picture Added to Gallery", Toast.LENGTH_SHORT).show()
    }

我什至尝试过这个,但是 insertImage 也被弃用了。

MediaStore.Images.Media.insertImage

还有其他选择吗?

我玩过 MediaStore.Images.Media.insertImage,它完成了工作。即使它被贬低了。如果有人找到更好的解决方案,请随时 post 这里。

private fun galleryAddPic2(imageUri:Uri, title:String) {

    val bitmap = MediaStore.Images.Media.getBitmap(requireContext().getContentResolver(), imageUri)
    val savedImageURL = MediaStore.Images.Media.insertImage(
        requireContext().contentResolver,
        bitmap,
        title,
        "Image of $title"
    )
    Toast.makeText(requireContext(), "Picture Added to Gallery", Toast.LENGTH_SHORT).show()
}

在图库中插入图片的完美方法如下:

    override suspend fun saveCameraImage(bitmap: Bitmap)
    {
            try {
                val collection = sdk29AndUp {
                    MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)
                } ?: MediaStore.Images.Media.EXTERNAL_CONTENT_URI
                val dirDest = File(
                    Environment.DIRECTORY_PICTURES,
                    context.getString(R.string.app_name) 
                )
                val date = System.currentTimeMillis()
                val fileName = "$date.${IMAGE_EXTENSIONS}"


                val contentValues = ContentValues().apply {
                    put(MediaStore.Images.Media.DISPLAY_NAME, fileName)
                    put(MediaStore.MediaColumns.MIME_TYPE, "image/$IMAGE_EXTENSIONS")
                    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)
                   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                    
                    put(MediaStore.MediaColumns.RELATIVE_PATH, "$dirDest${File.separator}")
                    put(MediaStore.Images.Media.IS_PENDING, 1)
                }
}

                val imageUri = context.contentResolver.insert(collection, contentValues)


                withContext(Dispatchers.IO) {

                    imageUri?.let { uri ->
                        context.contentResolver.openOutputStream(uri, "w").use { out ->
                            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out)
                        }

                        contentValues.clear()
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                    contentValues.put(MediaStore.Images.Media.IS_PENDING, 0)}
                        context.contentResolver.update(uri, contentValues, null, null)
                    }
                }



            } catch (e: FileNotFoundException) {
                
            }
        
    }