Excluir o arquivo após a partilha através da intenção
-
25-09-2019 - |
Pergunta
Eu estou tentando excluir um arquivo temporário após a partilha, através do android Intenção.ACTION_SEND recurso.Agora eu estou começando a atividade de um resultado e em OnActivityResult, eu sou de eliminar o ficheiro.Infelizmente, isso só funciona se eu estiver depurando-lo com um ponto, mas quando eu deixá-lo correr livremente e dizer de e-mail, o arquivo, a mensagem de e-mail sem anexo.
Eu acho que o que está acontecendo é que a minha atividade é a exclusão de um arquivo antes de ele ter sido enviado por e-mail.O que eu não entendo é por isso, não deve onActivityResult ser chamado somente APÓS a outra atividade é concluída?
Eu também tentei excluir o arquivo em onResume, mas sem sorte.
Não há melhor maneira de fazer isso?
Solução 4
Consegui fazer com que funcione:
File tbd = new File(sharePath);
tbd.deleteOnExit();
Isso parece excluir o arquivo quando a atividade fecha.
Outras dicas
Notei o mesmo comportamento com uma abordagem semelhante.Enquanto assistindo logcat para erros que eu vi o gmail reclamando que ele não conseguia encontrar o anexo.Isso, sim, parece que a intenção retorna ANTES que o gmail tem, na verdade, leia o arquivo anexo.
Eu ainda não tivemos tempo para uma solução ainda, mas provavelmente vai ser algo como:
- mover o arquivo para um diretório qualquer, então eu sei que é um que eu decidi enviar
- envie-o como anexo por meio de ACTION_SEND
- no próximo onResume para o meu ecrã de início de atividade, exclua os arquivos na pasta "enviados" de diretório que são mais velhos do que algum tempo frame que é razoavelmente longo, o suficiente para enviar para realmente ter acontecido
A escolha de um prazo adequado pode ser complicado, pois é provavelmente o caso que o gmail (ou outros ACTION_SEND fornecedores) não, na verdade, leia o arquivo até que ele tem uma conexão de rede.Eu estou pensando em 24 horas deve ser razoável e, no meu caso eu estou lidando com logs de diagnóstico, então não há nenhum dano real na exclusão de uma muito em breve, se o usuário tiver sido desligado da rede por um longo período de tempo.
Se o conteúdo do arquivo é texto e não obscenamente grandes de uma abordagem mais simples pode ser a ler o conteúdo do arquivo e use a Intenção.putExtra(android.conteúdo.Intenção.EXTRA_TEXT, yourText) embutido no corpo da mensagem.
O que eu fiz foi o seguinte.
Eu usei o:
myfile.deleteOnExit();
No entanto, como o Dr. mencionou no comentário abaixo resposta correta, isso não garante a exclusão do arquivo. É por isso que também estou excluindo o arquivo após o retorno da atividade compartilhada. Eu excluo o arquivo se houver arquivo. Porque o aplicativo travava às vezes, eu o coloquei lá dentro try{}
E funciona.
Não sei por que não funciona para você, mas para mim funciona, pelo menos para anexos do Gmail, textos, seguros, hangouts.
Na classe Delcaration:
static File file;
No método que chama a intenção:
Intent share = new Intent(Intent.ACTION_SEND);
share.setType("image/png");
// Compress the bitmap to PNG
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, bytes);
// Temporarily store the image to Flash
File sdCard = Environment.getExternalStorageDirectory();
File dir = new File (sdCard.getAbsolutePath() + "/FolderName");
dir.mkdirs();
// This file is static.
file = new File(dir, "FileName.png");
try {
file.createNewFile();
FileOutputStream fo = new FileOutputStream(file);
fo.write(bytes.toByteArray());
fo.flush();
fo.close();
} catch (IOException e) {
e.printStackTrace();
}
// Share compressed image
share.putExtra(Intent.EXTRA_STREAM, Uri.parse("file:///"+file.getPath()));
/** START ACTIVITY **/
startActivityForResult(Intent.createChooser(share,"Share Image"),1);
// Delete Temporary file
file.deleteOnExit(); // sometimes works
Em um método extra:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// Because app crashes sometimes without the try->catch
try {
// if file exists in memory
if (file.exists()) {
file.delete();
}
} catch (Exception e) {
Log.d(LOG,"Some error happened?");
}
}
Outra resposta em potencial seria criar um novo tópico quando o aplicativo retomar, marcar imediatamente o horário atual, dormir o tópico por mais tempo que você acha razoável que o arquivo seja enviado e, quando o tópico for retomar, exclua apenas arquivos criados antes do tempo marcado anteriormente. Isso lhe dará a capacidade de excluir apenas o que estava no local de armazenamento no momento em que seu aplicativo foi retomado, mas também dedicar tempo ao Gmail para obter o e -mail. Snippet de código: (estou usando C#/Xamarin, mas você deve ter a ideia)
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 Esta resposta é uma solução diferente que lida com várias perguntas. Se alguma coisa, as outras perguntas que eu publiquei devem ser marcadas como duplicatas porque são a mesma pergunta. Eu publiquei em cada um deles para garantir que quem tiver esse problema possa encontrar a solução.