用户从他们的图库中选择的图像存储在哪里?
Where to store images the user has selected from their gallery?
所以我正在制作的 原型应用程序 的功能之一允许用户创建食谱并添加缩略图和视频给它。一旦用户从他们的图库中选择了一张图像作为缩略图和视频,我应该如何存储它以及将其存储在何处以便在再次查看食谱时可以检索它?
这是将图像存储在 DCIM/ 目录中的代码
@Throws(IOException::class)
private fun saveImage(bitmap: Bitmap, name: String) {
val saved: Boolean
val fos: OutputStream?
fos = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
val resolver: ContentResolver = requireActivity().contentResolver
val contentValues = ContentValues()
contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, name)
contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/png")
contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, "DCIM/$IMAGE_DIRECTORY")
val imageUri =
resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)
resolver.openOutputStream(imageUri!!)
} else {
val imagesDir = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DCIM
).toString() + File.separator + IMAGE_DIRECTORY
val file = File(imagesDir)
if (!file.exists()) {
file.mkdir()
}
val image = File(imagesDir, "$name.png")
FileOutputStream(image)
}
saved = bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos)
fos!!.flush()
fos.close()
}
然后像这样获取所有图片作为 URI 列表
private fun getAllImages(): List<Uri>
{
val allImages = mutableListOf<Uri>()
val imageProjection = arrayOf(
MediaStore.Images.Media._ID
)
val imageSortOrder = "${MediaStore.Images.Media.DATE_ADDED} DESC"
val cursor = activity?.contentResolver?.query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
imageProjection,
null,
null,
imageSortOrder
)
cursor.use {
if (cursor != null)
{
val idColumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID)
while (cursor.moveToNext())
{
allImages.add(
ContentUris.withAppendedId(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
cursor.getLong(idColumn)
)
)
}
}
else
{
Log.d("AddViewModel", "Cursor is null!")
}
}
return allImages
}
然后查询它找到需要的图片
所以我正在制作的 原型应用程序 的功能之一允许用户创建食谱并添加缩略图和视频给它。一旦用户从他们的图库中选择了一张图像作为缩略图和视频,我应该如何存储它以及将其存储在何处以便在再次查看食谱时可以检索它?
这是将图像存储在 DCIM/ 目录中的代码
@Throws(IOException::class)
private fun saveImage(bitmap: Bitmap, name: String) {
val saved: Boolean
val fos: OutputStream?
fos = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
val resolver: ContentResolver = requireActivity().contentResolver
val contentValues = ContentValues()
contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, name)
contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/png")
contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, "DCIM/$IMAGE_DIRECTORY")
val imageUri =
resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)
resolver.openOutputStream(imageUri!!)
} else {
val imagesDir = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DCIM
).toString() + File.separator + IMAGE_DIRECTORY
val file = File(imagesDir)
if (!file.exists()) {
file.mkdir()
}
val image = File(imagesDir, "$name.png")
FileOutputStream(image)
}
saved = bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos)
fos!!.flush()
fos.close()
}
然后像这样获取所有图片作为 URI 列表
private fun getAllImages(): List<Uri>
{
val allImages = mutableListOf<Uri>()
val imageProjection = arrayOf(
MediaStore.Images.Media._ID
)
val imageSortOrder = "${MediaStore.Images.Media.DATE_ADDED} DESC"
val cursor = activity?.contentResolver?.query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
imageProjection,
null,
null,
imageSortOrder
)
cursor.use {
if (cursor != null)
{
val idColumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID)
while (cursor.moveToNext())
{
allImages.add(
ContentUris.withAppendedId(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
cursor.getLong(idColumn)
)
)
}
}
else
{
Log.d("AddViewModel", "Cursor is null!")
}
}
return allImages
}
然后查询它找到需要的图片