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