如何将图像保存到针对Android Q的应用程序的公共外部存储中的单独文件夹中?

时间:2019-12-05 22:00:25

标签: android mediastore android-external-storage android-10.0 android-storage

getExternalStoragePublicDirectory(字符串类型)已被弃用,如果面向Android Q的应用程序不提供对公共外部存储的访问。作为替代文档,建议使用MediaStore。

对于Android,Q图像可以保存到单独的文件夹“ Custom_Directory”中,该文件夹通过以下方式在MediaStore.Images.Media.RELATIVE_PATH中定义:

    val values = ContentValues().apply {
    put(MediaStore.Images.Media.DISPLAY_NAME, "name")
    put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")
    put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis())
    put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis())
    put(MediaStore.Images.Media.RELATIVE_PATH, "${Environment.DIRECTORY_PICTURES}/Custom_Directory/")
    put(MediaStore.Images.Media.IS_PENDING, 1)
}

val externalUri = MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)
val imageUri = context.contentResolver.insert(externalUri, values)
if (imageUri != null) {
    context.contentResolver.openOutputStream(imageUri).use { out ->
        bitmap?.compress(Bitmap.CompressFormat.JPEG, 100, out)
    }
    values.clear()
    values.put(MediaStore.Images.Media.IS_PENDING, 0)
    context.contentResolver.update(imageUri, values, null, null)
}

不幸的是,此代码需要API Build.VERSION_CODES.Q,因为MediaStore.Images.Media.RELATIVE_PATH仅适用于Android Q及更高版本。对于SDK级别低于Q的设备,可以通过另一种方式将图像保存到Pictures目录中。

val values = ContentValues().apply {
    put(MediaStore.Images.Media.DISPLAY_NAME, "name")
    put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")
    put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis())
}

val externalUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
val imageUri = context.contentResolver.insert(externalUri, values)
if (imageUri != null) {
    context.contentResolver.openOutputStream(imageUri).use { out ->
        bitmap?.compress(Bitmap.CompressFormat.JPEG, 100, out)
    }

但是我没有设法找到一种在画廊中创建单独文件夹的方法。同样,不能使用getExternalStoragePublicDirectory(String type)。

感谢您的想法。如果我走错了方向,请指正我。预先感谢!

0 个答案:

没有答案