无法从外部存储中删除位图

Posted

技术标签:

【中文标题】无法从外部存储中删除位图【英文标题】:cannot delete bitmap from external storage 【发布时间】:2018-12-04 01:53:14 【问题描述】:

我似乎无法从本地存储中删除图片。我想要发生的是:删除旧图片,添加同名的新图片。 当我更改图片名称时,将其作为新图片加载没有问题。但是,当我不更改其名称时,它会显示旧图片。 我尝试了 context.deleteFile(filename)。 file.exists 删除后返回 false,但图片仍然存在。 覆盖的解决方案可能会有所帮助。 我在清单中也有外部存储权限。 谢谢!

删除:

void deleteOldPicture(String filename, Context context)
    File file = new ImageSaver(context).setFileName(filename).setDirectoryName("images").createFile();
    file.delete();

创建文件

File createFile() 
    File directory;
    if(external)
        directory = getAlbumStorageDir(directoryName);
    
    else 
        directory = context.getDir(directoryName, Context.MODE_PRIVATE);
    
    return new File(directory, fileName);


private File getAlbumStorageDir(String albumName) 
    File file = new File(Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_PICTURES), albumName);
    if (!file.mkdirs()) 
        Log.e("ImageSaver", "Directory not created");
    
    return file;

保存文件:

private String saveFileInSD(String name, ImageView image)
    String filename = name+parentId+".png";
    Log.e("Filename is", filename);
    new ImageSaver(getApplicationContext()).setFileName(filename).setDirectoryName("images").save(((BitmapDrawable) image.getDrawable()).getBitmap());
    return filename;

【问题讨论】:

更改保存图片的目录。改用getExternalCacheDir(),这样拍同名照片时会临时保存并自动删除。 @007 还是同样的问题 我刚刚发布了一个答案,看看它并尝试将其调整为您的项目结构..希望它有所帮助。 (代码取自我的项目,它工作得非常好——保存一张同名的图片,当有新的图片时它会自动删除-)。 【参考方案1】:

将此库添加到您的 Gradle 中,这将有助于稍微清理您的代码:

implementation 'org.apache.commons:commons-io:1.3.2'

请执行以下操作以保存图片:

//Compress the Bitmap
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            yourBitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);

            //save Bitmap to file and get it form preview activity and especially to avoid TransactionTooLargeException
            File imageFile = new File(getExternalCacheDir(), "image.png");
            try 
                FileOutputStream imageFileStream = new FileOutputStream(imageFile);
                IOUtils.copyLarge(new ByteArrayInputStream(stream.toByteArray()), imageFileStream);
                IOUtils.closeQuietly(imageFileStream);
             catch (Exception e) 
                e.printStackTrace();
            

要获取保存位图的路径,只需使用以下方法:

imageFile.getAbsolutePath()

【讨论】:

谢谢!我想这也可以,但问题出在其他地方。我使用 glide 加载图像,它没有替换缓存中的图像。我不得不使用 Glide.with(context).load(file).apply(RequestOptions.skipMemoryCacheOf(true)) .apply(RequestOptions.diskCacheStrategyOf(DiskCacheStrategy.NONE)).into(subItemViewHolder.image); 很高兴您解决了您的问题!请在答案中发布您的修复并接受它,以便未来的读者可以从中受益..

以上是关于无法从外部存储中删除位图的主要内容,如果未能解决你的问题,请参考以下文章

将Android中的位图保存为外部存储中的JPEG文件夹

Android 11:无法从外部存储加载文件

无法在文件夹中写入外部存储下载 - Android

Azure Synapse 可以从外部关系存储中查询吗?

hive外部表分区

获取 Android 4.3 中的外部存储列表