Java 在android中共享文件后立即删除该文件

Java 在android中共享文件后立即删除该文件,java,android,file,file-sharing,Java,Android,File,File Sharing,我正在将图像文件共享给WhatsApp。 Whatsapp无法读取私有文件,所以我将其保存到公共目录中 我希望-->当用户共享映像时,应将其从存储器中删除 try { String uniqueName = System.currentTimeMillis() + ""; File tempFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "AB

我正在将图像文件共享给WhatsApp。 Whatsapp无法读取私有文件,所以我将其保存到公共目录中

我希望-->当用户共享映像时,应将其从存储器中删除

try {
   String uniqueName = System.currentTimeMillis() + "";
   File tempFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "ABBM-temp");
   if (!tempFile.exists()) {
       tempFile.mkdirs();
   }
   tempFile = new File(tempFile + uniqueName + ".png");

   FileOutputStream fOut = new FileOutputStream(tempFile);
   b.compress(Bitmap.CompressFormat.PNG, 100, fOut);
   fOut.flush();
   fOut.close();

   final Intent intent = new Intent(android.content.Intent.ACTION_SEND);
   intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
   intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(tempFile));
   intent.setType("image/png");
   startActivity(Intent.createChooser(intent, "Share image via"));
   //tempFile.delete();

} catch (Exception e) {
   e.printStackTrace();
   Toast.makeText(getApplicationContext(), "Image not shared, please grant storage permission", Toast.LENGTH_SHORT).show();
}
上面的代码打开共享意图,但在后台删除文件,我无法共享该文件

共享文件并将其删除。


谢谢。

您的代码有点笨重,在最新版本的Android中肯定会有错误。以下是一些观察结果:

解决方案1 1.使用
文件提供程序
并写入专用存储区域 我知道您正在向主存储器写入数据,因此其他应用程序可以读取该文件,但不应该这样做。使用文件提供程序并从中获取Uri。以下是文档:。当您设置了文件提供程序后(相信我,这很容易,您只需向清单中添加一个片段并添加一个xml路径),您就可以私下写入内存。像这样:

FileOutputStream fOut = openFileOutput("the_name_of_file_here", Context.MODE_PRIVATE);
b.compress(Bitmap.CompressFormat.PNG, 100, fOut);
fOut.flush();
fOut.close();
File file = new File(getFilesDir(), "the_name_of_file_here");
Uri uri = getUriForFile(this, "com.yourpackagename.fileprovider", file);
//Create your share intent as you do in your code, then:
startActivityForResult(intent, 512); //I passed 512 you can pass anything you want
然后使用
getUriForFile
您可以获得一个Uri,该Uri可由您授予访问权限的任何应用程序使用。像这样:

FileOutputStream fOut = openFileOutput("the_name_of_file_here", Context.MODE_PRIVATE);
b.compress(Bitmap.CompressFormat.PNG, 100, fOut);
fOut.flush();
fOut.close();
File file = new File(getFilesDir(), "the_name_of_file_here");
Uri uri = getUriForFile(this, "com.yourpackagename.fileprovider", file);
//Create your share intent as you do in your code, then:
startActivityForResult(intent, 512); //I passed 512 you can pass anything you want
2.使用
ShareCompat
当您设置了
FileProvider
后,我建议您使用
ShareCompat
而不是常规的共享活动来共享文件。ShareCompat的优势在于它得到了谷歌的官方支持,你也可以与它共享大量文件。无需向其他应用程序授予
URI\u权限
。下面是一个例子:

Intent shareIntent = ShareCompat.IntentBuilder.from(this)
                    .setType(type) //This is the MIME type
                    .setStream(uri) //This is the uri we got earlier
                    .getIntent();
shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

startActivity(shareIntent); //Starting the activity
我建议你看看这个博客:了解更多信息。希望这有帮助

解决方案2 传统解决方案: 如果出于偏好或因为它更适合您的应用程序,您仍然希望使用您的功能,那么您可以做一件事:

不要使用
startActivity(Intent)
使用
startActivityForResult(Intent,int)
。这样,您可以传递一个作为id的整数值。然后,当共享文件并返回应用程序时,将触发
onActivityResult()
函数。它将有一个
requestCode
。像这样:

FileOutputStream fOut = openFileOutput("the_name_of_file_here", Context.MODE_PRIVATE);
b.compress(Bitmap.CompressFormat.PNG, 100, fOut);
fOut.flush();
fOut.close();
File file = new File(getFilesDir(), "the_name_of_file_here");
Uri uri = getUriForFile(this, "com.yourpackagename.fileprovider", file);
//Create your share intent as you do in your code, then:
startActivityForResult(intent, 512); //I passed 512 you can pass anything you want
然后重写此函数:

@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    
    //Check if it is from the same code, if yes delete the temp file
    if(requestCode == 512) {
       tempFile.delete();
    }
}

我认为您在将tempfile传递给intent之前正在关闭流。尝试在图像传递到目标后关闭流,例如在startActivity@al_khalid不,这不是错误。错误在于他在用户选择whatsapp并共享文件之前删除了该文件。他需要做的是共享文件,然后删除文件。@al_khalid事实上,共享文件的代码是完美的,但是共享后删除文件的代码放在哪里呢?用户单击共享图像按钮,选择whatsapp,图像共享,删除它。感谢您的回答,但将文件保存在公用目录中的目的是因为在android 8.0中whatsapp没有收到图像文件,它说“文件格式不受支持”,但在棒棒糖版本中没有问题。。所以我试着从公共目录中共享图像,结果成功了。但你们知道,每次当用户共享一个图像时,它都会保存在那个里,并且会占用存储空间,,,所以我想在用户共享图像之后删除它。谢谢。是的,请看第二个解决方案。