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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top