Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用路径删除文件_Android_File_Android Intent_Android Bitmap_Mediastore - Fatal编程技术网

Android 如何使用路径删除文件

Android 如何使用路径删除文件,android,file,android-intent,android-bitmap,mediastore,Android,File,Android Intent,Android Bitmap,Mediastore,我正在构建一个应用程序,允许用户保存位图或在不保存位图的情况下共享位图。第二个功能不太管用。我知道在社交媒体应用程序上共享文件之前,应用程序需要将文件保存到设备上,因此我的想法是,在成功共享文件后,立即从设备上自动删除文件。我构建了一个delete方法,尝试了两种不同的方法,但都不起作用: 第一种方法: public void deleteFile(String path){ File file = new File(path); try {

我正在构建一个应用程序,允许用户保存位图或在不保存位图的情况下共享位图。第二个功能不太管用。我知道在社交媒体应用程序上共享文件之前,应用程序需要将文件保存到设备上,因此我的想法是,在成功共享文件后,立即从设备上自动删除文件。我构建了一个delete方法,尝试了两种不同的方法,但都不起作用:

第一种方法:

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();
}
第二种方法:

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();
}
我正在从共享方法调用deleteFileString:

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);
}

首先,你需要检查你的文件是否存在,也许你设置了错误的路径?。然后删除该文件


关于您声明的问题,insertImage返回Uri的字符串表示形式。该Uri不是一个文件。对其调用getPath是毫无意义的,并且不能删除基于该路径的任何内容

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

不要把它放在MediaStore中 不要共享它,因为你将在其他应用程序有机会使用它之前删除它 如果您想共享它,然后删除它:

不要把它放在MediaStore中 第二天,或者几个小时后,或者别的什么时候删除它,因为你没有办法知道其他应用程序什么时候完成了内容 要在不使用MediaStore的情况下与其他应用共享图像,请执行以下操作:

将图像保存到getCacheDir中的一个文件,并在上下文(如活动或服务)上调用该文件 使用FileProvider使该文件可供其他应用程序使用 除此之外:

不要在发送操作中使用通配符MIME类型。您是提供要发送的内容的人。你知道真正的MIME类型。使用它

请注意,不要求ACTION_SEND活动同时支持额外的_文本和额外的_流。大多数似乎是这样做的,但这种行为超出了ACTION\u SEND规范的范围

请注意,Android Q上不推荐使用insertImage


如何获取文件夹?@AndrosAdrianopolos检查此答案如何获取文件夹路径图像仍然保存。当我删除代码时:String path=MediaStore.Images.Media.insertImageObjects.requirennullgetcontext.getContentResolver,位图,Meme,null;,我无法再共享任何内容,因此此路径确实存在。@AndrosAdrianopolos我更新了答案,请不要检查文件夹是否存在,只检查文件是否也存在。可能是因为从未调用boolean deleted吗?假设用户希望构建和共享多个meme。有没有一种方法可以通过每次用户希望共享时覆盖上一个文件来将它们保存在缓存中?@AndrosAdrianopolos:嗯,每次都可以使用相同的文件名。但是,这可能会混淆正在进行共享的应用程序,因此我不建议这样做。我只需检查每个应用程序启动时的缓存,并删除超过X小时的图像文件,以获得X值。