java - 如何将位图保存到android画廊

标签 java android image bitmap gallery

不幸的是,我发现的解决方案在 android 5.1.1 上不起作用。 我有一个名为源的位图。我需要将它直接保存到手机的图库中。我的 list 包含 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 你能给我一个工作方法吗?

最佳答案

在 API 29 (Android Q) 之前有几种不同的方法可以做到这一点,但所有这些都涉及一个或几个被 Q 弃用的 API。在 2019 年,这是一种向后和向前兼容的方法:

(因为现在是 2019 年所以我将使用 Kotlin 编写)

    /// @param folderName can be your app's name
    private fun saveImage(bitmap: Bitmap, context: Context, folderName: String) {
        if (android.os.Build.VERSION.SDK_INT >= 29) {
            val values = contentValues()
            values.put(MediaStore.Images.Media.RELATIVE_PATH, "Pictures/" + folderName)
            values.put(MediaStore.Images.Media.IS_PENDING, true)
            // RELATIVE_PATH and IS_PENDING are introduced in API 29.

            val uri: Uri? = context.contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values)
            if (uri != null) {
                saveImageToStream(bitmap, context.contentResolver.openOutputStream(uri))
                values.put(MediaStore.Images.Media.IS_PENDING, false)
                context.contentResolver.update(uri, values, null, null)
            }
        } else {
            val directory = File(Environment.getExternalStorageDirectory().toString() + separator + folderName)
            // getExternalStorageDirectory is deprecated in API 29

            if (!directory.exists()) {
                directory.mkdirs()
            }
            val fileName = System.currentTimeMillis().toString() + ".png"
            val file = File(directory, fileName)
            saveImageToStream(bitmap, FileOutputStream(file))
            if (file.absolutePath != null) {
                val values = contentValues()
                values.put(MediaStore.Images.Media.DATA, file.absolutePath)
                // .DATA is deprecated in API 29
                context.contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values)
            }
        }
    }

    private fun contentValues() : ContentValues {
        val values = ContentValues()
        values.put(MediaStore.Images.Media.MIME_TYPE, "image/png")
        values.put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis() / 1000);
        values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis());
        return values
    }

    private fun saveImageToStream(bitmap: Bitmap, outputStream: OutputStream?) {
        if (outputStream != null) {
            try {
                bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream)
                outputStream.close()
            } catch (e: Exception) {
                e.printStackTrace()
            }
        }
    }

此外,在调用它之前,您需要先拥有 WRITE_EXTERNAL_STORAGE

关于java - 如何将位图保存到android画廊,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36624756/

相关文章:

jQuery 函数没有使用变量

c++ - 图像旋转给出灰度图像

java - 如何使用 Jsoup 从网页中提取多个电子邮件地址?

java - 如何从EditText中获取文本?

android - Facebook SDK 的 logInWithPublishPermissions 卡在永久微调器上

java - 解析字符串并创建 json 格式,然后保存到文本文件

css - 如何定位动态大小的图像与顶部边框齐平?

java - 为什么如果静态方法不涉及多态性(后期绑定(bind))我会看到无法覆盖静态方法的错误

java - 如何从 Spring boot maven web 项目调用 dll?

java - 颜色选择器崩溃 intellij