【问题标题】:How to delete a file using the path如何使用路径删除文件
【发布时间】:2019-04-05 09:07:16
【问题描述】:

我正在构建一个允许用户保存位图或在不保存的情况下共享它的应用程序。第二个功能不太好用。我知道应用程序需要先将文件保存到设备上,然后才能在社交媒体应用程序上共享,所以我的想法是,在文件成功共享后立即自动从设备中删除文件。我已经构建了一个删除方法,尝试了 2 种不同的方法,但都没有奏效:

第一种方法:

public void deleteFile(String path){
        File file = new File(path);
        try {
            file.getCanonicalFile().delete();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

第二种方法:

public void deleteFile(String path){
    File file = new File(path);
    boolean deleted = file.delete();
}

我正在通过共享方法调用deleteFile(String)

public void shareMeme(Bitmap bitmap) {
    String path = MediaStore.Images.Media.insertImage(Objects.requireNonNull(getContext()).getContentResolver(), bitmap, "Meme", null);
    Uri uri = Uri.parse(path);

    Intent share = new Intent(Intent.ACTION_SEND);
    share.setType("image/*");
    share.putExtra(Intent.EXTRA_STREAM, uri);
    share.putExtra(Intent.EXTRA_TEXT, "This is my Meme");
    getContext().startActivity(Intent.createChooser(share, "Share Your Meme!"));

    deleteFile(path);
}

【问题讨论】:

    标签: android file android-intent android-bitmap mediastore


    【解决方案1】:

    关于您陈述的问题,insertImage() 返回Uri 的字符串表示形式。 Uri 不是文件。对它调用getPath() 是没有意义的,你不能基于该路径删除任何东西。

    更广泛地说,如果您打算立即删除内容:

    • 不要放在MediaStore
    • 请勿分享,因为您将在其他应用有机会对其进行任何操作之前将其删除

    如果你想分享它,然后删除它:

    • 不要放在MediaStore
    • 第二天或几小时后删除它,因为您无法知道其他应用何时完成内容处理

    在不使用MediaStore 的情况下与其他应用共享图像:

    • 将图像保存到getCacheDir() 中的文件(在Context 上调用,例如ActivityService
    • 使用FileProvider 使该文件可供其他应用使用

    除此之外:

    • 不要在 ACTION_SEND 中使用通配符 MIME 类型。 是提供要发送的内容的人。 知道实际的 MIME 类型。使用它。

    • 请注意,ACTION_SEND 活动不需要同时支持 EXTRA_TEXTEXTRA_STREAM。大多数人似乎都这样做了,但这种行为超出了ACTION_SEND 规范。

    • 请注意,insertImage() 在 Android Q 上已弃用。

    【讨论】:

    • 说用户想要创建和分享超过 1 个 meme。有没有一种方法可以在每次用户希望共享时覆盖前一个来将它们保存在缓存中?
    • @AndrosAdrianopolos:嗯,你可以每次都使用相同的文件名。但是,这可能会混淆正在执行共享的应用程序,因此我不推荐它。我会在每个应用程序启动时检查缓存并删除早于 X 小时的图像文件,以获得 X 的某些值。
    【解决方案2】:

    首先,您需要检查您的file 是否存在,(也许您设置了错误的路径?)。然后删除file

            File file = new File(path);
            if (file.exists()){
                if (file.delete()) {
                  Toast.makeText(this, "file Deleted :" + path, Toast.LENGTH_SHORT).show();
                  } else {
                  Toast.makeText(this, "file not Deleted :" + path, Toast.LENGTH_SHORT).show();
    
                  }
            }
    

    【讨论】:

    • 我如何获得folder
    • @AndrosAdrianopolos 检查这个答案 如何获取文件夹路径 stackoverflow.com/a/28594333/5805371
    • 图像仍被保存。当我删除代码:String path = MediaStore.Images.Media.insertImage(Objects.requireNonNull(getContext()).getContentResolver(), bitmap, "Meme", null); 时,我无法再分享任何内容,所以这条路径确实存在。
    • @AndrosAdrianopolos 我更新了答案,不检查文件夹是否存在,只检查文件
    • 还有。难道是因为boolean deleted 从未被调用过?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    • 2019-08-18
    • 2012-10-13
    相关资源
    最近更新 更多