【问题标题】:Delete file after sent to mail as Intent.ACTION_SEND以 Intent.ACTION_SEND 发送到邮件后删除文件
【发布时间】:2012-12-31 08:20:58
【问题描述】:

我有以下代码:

Uri screenshotUri = Uri.fromFile(file);
        Intent intent = new Intent(Intent.ACTION_SEND);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.putExtra(Intent.EXTRA_STREAM, screenshotUri);
        intent.putExtra(Intent.EXTRA_SUBJECT, "Location of " + name);
        intent.putExtra(Intent.EXTRA_TITLE, getText(R.string.screen_share_message));
        intent.putExtra(Intent.EXTRA_TEXT, getText(R.string.screen_share_message));
        intent.setType("image/*");
        startActivity(Intent.createChooser(intent, "Share with"));

用户发送或分享文件后,如何删除?

【问题讨论】:

    标签: android file android-intent


    【解决方案1】:

    如果你的问题是你怎么知道什么时候删除文件,那么答案是你不知道。

    我使用的方法是将文件保存在应用程序的缓存目录中(internalexternal)。因此,当设备存储空间不足时,它会被 Android 自动删除。不过,作为一种好的做法,我会先删除缓存中的所有现有文件,然后再共享新文件。

    要实际删除文件,请参阅@Sahil 的回答

    【讨论】:

      【解决方案2】:

      首先参考@Dheeraj V.S.回答。

      删除文件的方法

      1. 您可以使用后台运行的服务删除这些文件。服务检查文件夹是否包含任何文件,然后在服务中写入逻辑,以便它将文件删除。

      2. 您可以在启动应用程序时删除这些文件。表示特定文件夹中是否存在任何文件,因此在开始欢迎活动时,您可以将逻辑删除文件。

      //删除隐藏文件

      try {
            new Helper().deleteFromExternalStorage(".photo.jpg");
      }
      catch(Exception e){
            Log.v("APP","Exception while deleting file");
      }
      

      从外部存储中删除文件的方法

      public void deleteFromExternalStorage(String fileName) {
        String fullPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/directoryname";
        try
        {
          File file = new File(fullPath, fileName);
          if(file.exists())
              file.delete();
        }
        catch (Exception e)
        {
          Log.e("APP", "Exception while deleting file " + e.getMessage());
        }
      }
      

      【讨论】:

        【解决方案3】:

        Intent 之后,您可以使用以下代码从外部存储中删除文件,

        File file = new File(selectedFilePath);
        boolean deleted = file.delete();
        

        其中 selectedFilePath 是您要删除的文件的路径 - 例如:

        /sdcard/YourCustomDirectory/ExampleFile.mp3

        【讨论】:

          【解决方案4】:

          当您根据活动生命周期打开电子邮箱时,您当前的活动在您返回活动时继续 onPause() 然后 On Resume 方法将调用因此在您的 on Resume 方法上编写打击代码。这个技巧解决了我的问题.

          protected void onResume() {
              // TODO Auto-generated method stub
              File file= new File(android.os.Environment.getExternalStorageDirectory().toString()+ "/akanksha" + ".png");
              if(file.exists())
              {
                   file.delete();
              }
              super.onResume();
          }
          

          【讨论】:

          • 并非在所有情况下都有效。 Gmail 以异步模式将文件附加到邮件中,这意味着您可以在真正附加之前获得 onResume 和删除文件!
          【解决方案5】:

          另一个可能的答案是在您的应用程序恢复时创建一个新线程,立即标记当前时间,让线程休眠多久您认为发送文件是合理的,当线程恢复时,只删除文件在先前标记的时间之前创建。这将使您能够只删除在您的应用程序恢复时存储位置中的内容,但也可以让 gmail 有时间将电子邮件发送出去。最后,它解决了您通过电子邮件发送一组文件,然后通过电子邮件发送第二组文件的情况,但是当您清理第一组文件时,您会在第二组文件被发送之前删除它,这可以保证您只删除您放置的文件在发送电子邮件时在目录中。代码 sn-p:(我使用的是 C#/Xamarin,但你应该明白)

          public static void ClearTempFiles()
          {
              Task.Run(() =>
              {
          
              try
              {
                  DateTime threadStartTime = DateTime.UtcNow;
                  await Task.Delay(TimeSpan.FromMinutes(DeletionDelayMinutes));
                  DirectoryInfo tempFileDir = new DirectoryInfo(TempFilePath);
                  FileInfo[] tempFiles = tempFileDir.GetFiles();
                  foreach (FileInfo tempFile in tempFiles)
                  {
                      if (tempFile.CreationTimeUtc < threadStartTime)
                      {
                          File.Delete(tempFile.FullName);
                      }
                  }
              }
              catch { }
          });
          

          } @Martijn Pieters 这个答案是一个不同的解决方案,可以处理多个问题。如果有的话,我发布的其他问题应该被标记为重复,因为它们是同一个问题。我发布了他们每个人,以确保遇到此问题的人都能找到解决方案。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-06-20
            • 1970-01-01
            • 2022-12-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多