使用 ImagePath 从 InternalStorage 中删除图像
Delete a image from InternalStorage using ImagePath
我正在使用 Android 版本 10。
我已启用读取和写入存储的权限
设备名称:Poco F1
场景:我必须捕获当前布局的屏幕截图并将其保存到 internalStorage 并向用户预览该图像。在这里用户可以选择删除图像。
这是我用来保存和删除的代码
保存截图:
//I will pass the bitmap here
fun saveBitmapToInternalStorage(bitmap: Bitmap?) {
bitmap?.let {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
saveBitmapToOlderDevice(it)
} else {
saveBitmapToNewerDevice(it)
}
}
}
//This method is to save image to newerdevice >= Q
@RequiresApi(Build.VERSION_CODES.Q)
private fun saveBitmapToNewerDevice(bitmap: Bitmap) {
val uri = generateUri()
context.contentResolver.openOutputStream(uri ?: return).use { outputStream ->
outputStream?.let {
writeBitmapToJpeg(bitmap, outputStream, uri.toString())
}
}
}
//This is to generate the URI.
@RequiresApi(Build.VERSION_CODES.Q)
private fun generateUri(): Uri? {
val dateFormat = getDateFormat()
val contentValues = ContentValues().apply {
put(MediaStore.MediaColumns.DISPLAY_NAME, "${dateFormat}.jpg")
put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg")
put(MediaStore.MediaColumns.RELATIVE_PATH, "Pictures/${context.resources.getString(R.string.app_name)}")
}
return context.contentResolver.insert(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
contentValues
)
}
// To save images to olderDevice
private fun saveBitmapToOlderDevice(bmp: Bitmap) {
val filename = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)?.absolutePath +
"/${context.resources.getString(R.string.app_name)}/${getDateFormat()}.jpg"
createDirectory(filename)
val outputStream = FileOutputStream(filename)
writeBitmapToJpeg(bmp, outputStream, filename)
}
//This method is to save the image to InternalStorage
private fun writeBitmapToJpeg(bmp: Bitmap, outputStream: OutputStream, imagePath: String) {
try {
val outputData = ByteArrayOutputStream()
bmp.compress(CompressFormat.JPEG, 100, outputData)
outputData.writeTo(outputStream)
outputStream.flush()
outputStream.close()
} catch (e: IOException) {
showBitmapWriteErrorMessage()
}
}
我把图片存入internalStorgae时保存了路径
路径看起来像
/storage/emulated/0/Pictures/TGP AR/20211011142001.jpg
我将这条路径传递给下面的方法
删除图片:
private fun deleteImage(imagePath: String) {
val file = File(imagePath)
file.delete()
}
file.exists() 正在返回 true。
file.delete() 返回 false。
我认为,可能有两种不同的删除方式 ( > & < Q )。
请帮助我
您可以通过将您的方法修改为以下内容来删除图像:
private fun deleteImage(imagePath: Uri) {
getContentResolver().delete(imagePath, null, null)
}
然后通过generateUri()
创建的Uri
删除文件
我正在使用 Android 版本 10。 我已启用读取和写入存储的权限 设备名称:Poco F1
场景:我必须捕获当前布局的屏幕截图并将其保存到 internalStorage 并向用户预览该图像。在这里用户可以选择删除图像。
这是我用来保存和删除的代码
保存截图:
//I will pass the bitmap here
fun saveBitmapToInternalStorage(bitmap: Bitmap?) {
bitmap?.let {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
saveBitmapToOlderDevice(it)
} else {
saveBitmapToNewerDevice(it)
}
}
}
//This method is to save image to newerdevice >= Q
@RequiresApi(Build.VERSION_CODES.Q)
private fun saveBitmapToNewerDevice(bitmap: Bitmap) {
val uri = generateUri()
context.contentResolver.openOutputStream(uri ?: return).use { outputStream ->
outputStream?.let {
writeBitmapToJpeg(bitmap, outputStream, uri.toString())
}
}
}
//This is to generate the URI.
@RequiresApi(Build.VERSION_CODES.Q)
private fun generateUri(): Uri? {
val dateFormat = getDateFormat()
val contentValues = ContentValues().apply {
put(MediaStore.MediaColumns.DISPLAY_NAME, "${dateFormat}.jpg")
put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg")
put(MediaStore.MediaColumns.RELATIVE_PATH, "Pictures/${context.resources.getString(R.string.app_name)}")
}
return context.contentResolver.insert(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
contentValues
)
}
// To save images to olderDevice
private fun saveBitmapToOlderDevice(bmp: Bitmap) {
val filename = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)?.absolutePath +
"/${context.resources.getString(R.string.app_name)}/${getDateFormat()}.jpg"
createDirectory(filename)
val outputStream = FileOutputStream(filename)
writeBitmapToJpeg(bmp, outputStream, filename)
}
//This method is to save the image to InternalStorage
private fun writeBitmapToJpeg(bmp: Bitmap, outputStream: OutputStream, imagePath: String) {
try {
val outputData = ByteArrayOutputStream()
bmp.compress(CompressFormat.JPEG, 100, outputData)
outputData.writeTo(outputStream)
outputStream.flush()
outputStream.close()
} catch (e: IOException) {
showBitmapWriteErrorMessage()
}
}
我把图片存入internalStorgae时保存了路径 路径看起来像
/storage/emulated/0/Pictures/TGP AR/20211011142001.jpg 我将这条路径传递给下面的方法
删除图片:
private fun deleteImage(imagePath: String) {
val file = File(imagePath)
file.delete()
}
file.exists() 正在返回 true。 file.delete() 返回 false。
我认为,可能有两种不同的删除方式 ( > & < Q )。 请帮助我
您可以通过将您的方法修改为以下内容来删除图像:
private fun deleteImage(imagePath: Uri) {
getContentResolver().delete(imagePath, null, null)
}
然后通过generateUri()
创建的Uri
删除文件