【问题标题】:How to add a photo to android built-in Gallery in kotlin?如何将照片添加到 kotlin 中的 android 内置图库?
【发布时间】:2021-10-28 05:31:21
【问题描述】:

在我的应用程序中,我拍摄了一张照片(在片段中),然后我试图将其保存到图库中。当我去画廊时,它不在那里。它只保留在 app 文件夹中。我正在关注 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

还有其他选择吗?

【问题讨论】:

    标签: android kotlin camera gallery


    【解决方案1】:

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

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

    【讨论】:

    • 这仅适用于 API 级别 29 及更高级别吗?
    • 整个代码也适用于 api 29 及以下版本,只需将 RELATIVE_PATH 替换为 DATA 并删除 .ISPENDING 其余部分将保持不变
    • 我已经更新了所有版本的代码
    【解决方案2】:

    我玩过 MediaStore.Images.Media.insertImage,它完成了工作。即使它已被废弃。如果有人找到更好的解决方案,请随时在此处发布。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-27
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      • 2016-11-28
      • 1970-01-01
      • 1970-01-01
      • 2020-03-19
      相关资源
      最近更新 更多