Como excluir um arquivo do cartão SD?

131

Estou criando um arquivo para enviar como anexo a um email. Agora eu quero excluir a imagem depois de enviar o email. Existe uma maneira de excluir o arquivo?

Eu tentei, myFile.delete();mas ele não excluiu o arquivo.


Como estou usando esse código para Android, a linguagem de programação é Java, usando as formas usuais do Android para acessar o cartão SD. Estou excluindo o arquivo no onActivityResultmétodo, quando um Intenté retornado à tela após o envio de um email.

mudit
fonte
Você precisa fornecer mais informações sobre o problema, como o idioma que você está usando, como você está acessando o cartão SD, etc.
Amok
você está liberando as alterações no disco?
Charles Ma
10
@ Amuck Eu acho que é seguro assumir que ele está usando Java, já que ele não especificou.
Jeremy Logan
Soa muito suspeito se você me perguntar ...
Studocwho 05/02

Respostas:

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

onde selectedFilePath é o caminho do arquivo que você deseja excluir - por exemplo:

/sdcard/YourCustomDirectory/ExampleFile.mp3

Niko Gamulin
fonte
Acho que as crianças internas não são excluídos .. você tem que eliminar todos childs.See interior minha resposta abaixo ..
Zar E Ahmer
2
Infelizmente, isso não funcionará no Android 4.4 ou superior. Veja minha resposta abaixo.
Stevo.mit 20/05
Não entendo como isso funcionou para muitos. "excluído" parece acinzentado no Android Studio.
TheOnlyAnil 6/06/2015
Sim, eu estava enviando caminho como "file: /// armazenamento / ...", que não funcionou
Jemshit Iskenderov
1
@ stevo.mit você encontrou a solução? Também estou enfrentando o mesmo problema não é possível excluir o arquivo do sdcard acima do Android 4.4 ou superior. Mas o mesmo código funcionando para 4.3 /
hasnain_ahmad
79

Você também precisa dar permissão se estiver usando> 1.6 SDK

uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"

no AndroidManifest.xmlarquivo

neeloor2004
fonte
mas para removível de armazenamento SD Card você também precisaContentResolver
USER25
35

Alterar para Android 4.4 ou superior

Os aplicativos não têm permissão para gravar (excluir, modificar ...) no armazenamento externo , exceto nos diretórios específicos de pacotes .

Como a documentação do Android afirma:

"Os aplicativos não devem poder gravar em dispositivos de armazenamento externos secundários, exceto nos diretórios específicos de pacotes, conforme permitido pelas permissões sintetizadas."

No entanto solução alternativa desagradável existe (consulte o código abaixo) . Testado no Samsung Galaxy S4, mas essa correção não funciona em todos os dispositivos. Além disso, eu não contaria com esta solução alternativa disponível em versões futuras do Android.

Há um ótimo artigo explicando as alterações nas permissões de armazenamento externo (4.4+) .

Você pode ler mais sobre a solução alternativa aqui . O código fonte da solução alternativa é deste site .

public class MediaFileFunctions 
{
    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public static boolean deleteViaContentProvider(Context context, String fullname) 
    { 
      Uri uri=getFileUri(context,fullname); 

      if (uri==null) 
      {
         return false;
      }

      try 
      { 
         ContentResolver resolver=context.getContentResolver(); 

         // change type to image, otherwise nothing will be deleted 
         ContentValues contentValues = new ContentValues(); 
         int media_type = 1; 
         contentValues.put("media_type", media_type); 
         resolver.update(uri, contentValues, null, null); 

         return resolver.delete(uri, null, null) > 0; 
      } 
      catch (Throwable e) 
      { 
         return false; 
      } 
   }

   @TargetApi(Build.VERSION_CODES.HONEYCOMB)
   private static Uri getFileUri(Context context, String fullname) 
   {
      // Note: check outside this class whether the OS version is >= 11 
      Uri uri = null; 
      Cursor cursor = null; 
      ContentResolver contentResolver = null;

      try
      { 
         contentResolver=context.getContentResolver(); 
         if (contentResolver == null)
            return null;

         uri=MediaStore.Files.getContentUri("external"); 
         String[] projection = new String[2]; 
         projection[0] = "_id"; 
         projection[1] = "_data"; 
         String selection = "_data = ? ";    // this avoids SQL injection 
         String[] selectionParams = new String[1]; 
         selectionParams[0] = fullname; 
         String sortOrder = "_id"; 
         cursor=contentResolver.query(uri, projection, selection, selectionParams, sortOrder); 

         if (cursor!=null) 
         { 
            try 
            { 
               if (cursor.getCount() > 0) // file present! 
               {   
                  cursor.moveToFirst(); 
                  int dataColumn=cursor.getColumnIndex("_data"); 
                  String s = cursor.getString(dataColumn); 
                  if (!s.equals(fullname)) 
                     return null; 
                  int idColumn = cursor.getColumnIndex("_id"); 
                  long id = cursor.getLong(idColumn); 
                  uri= MediaStore.Files.getContentUri("external",id); 
               } 
               else // file isn't in the media database! 
               {   
                  ContentValues contentValues=new ContentValues(); 
                  contentValues.put("_data",fullname); 
                  uri = MediaStore.Files.getContentUri("external"); 
                  uri = contentResolver.insert(uri,contentValues); 
               } 
            } 
            catch (Throwable e) 
            { 
               uri = null; 
            }
            finally
            {
                cursor.close();
            }
         } 
      } 
      catch (Throwable e) 
      { 
         uri=null; 
      } 
      return uri; 
   } 
}
stevo.mit
fonte
1
Não está funcionando para note3. Eu recebi o erro "MediaProvider: Não foi possível excluir /mnt/extSdCard/test.zip"
iscariot
2
Eu tenho um não enraizadas Moto X na 4.4.4 e não têm escrita problema de / sdcard / mydirectory
Rob
"Infelizmente, ele não funciona mais nas versões mais recentes do Kitkat, tudo foi bloqueado". citado do autor "ghisler (Autor)"
HendraWD 04/04
O Android está se fechando cada vez mais. Terminaremos com uma cópia feia do iOS !!
Phantômaxx 5/05
Isso falha para mim (Android 7.1). Ele sempre retorna falsee não exclui o arquivo :-(
Spikatrix
18

O contexto do Android tem o seguinte método:

public abstract boolean deleteFile (String name)

Acredito que isso fará o que você deseja com as premissas corretas do aplicativo, conforme listado acima.

Yossi
fonte
3
Essa deve ser a resposta correta. context.deleteFile(filename);
Lisandro
11

Exclua recursivamente todos os filhos do arquivo ...

public static void DeleteRecursive(File fileOrDirectory) {
    if (fileOrDirectory.isDirectory()) {
        for (File child : fileOrDirectory.listFiles()) {
            DeleteRecursive(child);
        }
    }

    fileOrDirectory.delete();
}
Zar E Ahmer
fonte
9

Isso funciona para mim: (Excluir imagem da Galeria)

File file = new File(photoPath);
file.delete();

context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File(photoPath))));
Jiyeh
fonte
2
O que context.sendBroadcast () faz?
Megaetron
Basicamente, ele envia / transmite a intenção (operação a ser executada) a todos os receptores correspondentes a essa intenção. link
Jiyeh
6
 public static boolean deleteDirectory(File path) {
    // TODO Auto-generated method stub
    if( path.exists() ) {
        File[] files = path.listFiles();
        for(int i=0; i<files.length; i++) {
            if(files[i].isDirectory()) {
                deleteDirectory(files[i]);
            }
            else {
                files[i].delete();
            }
        }
    }
    return(path.delete());
 }

Este código irá ajudá-lo .. E no manifesto do Android, você precisa obter permissão para fazer modificações.

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Vivek Elangovan
fonte
arquivos [] pode ser nulo se:file.exists:true file.isDirectory:true file.canRead:false file.canWrite:false
ILW
Eu acho que vocês não sabem que alguns telefones Android restringem o acesso de gravação a cartões SD.
4

Tente isso.

File file = new File(FilePath);
FileUtils.deleteDirectory(file);

Apache Commons

Rahul Giradkar
fonte
1

Desculpe: houve um erro no meu código antes devido à validação do site.

String myFile = "/Name Folder/File.jpg";  

String myPath = Environment.getExternalStorageDirectory()+myFile;  

File f = new File(myPath);
Boolean deleted = f.delete();

Eu acho que é claro ... Primeiro você deve saber a localização do seu arquivo. Segundo ,,, Environment.getExternalStorageDirectory()é um método que obtém o diretório do aplicativo. Por fim, a classe File que manipula seu arquivo ...

Denis IJCU
fonte
1

Eu tive um problema semelhante com um aplicativo em execução no 4.4. O que eu fiz foi uma espécie de hack.

Renomeei os arquivos e os ignorei no meu aplicativo.

ie

File sdcard = Environment.getExternalStorageDirectory();
                File from = new File(sdcard,"/ecatAgent/"+fileV);
                File to = new File(sdcard,"/ecatAgent/"+"Delete");
                from.renameTo(to);
kkm
fonte
0

Isso funcionou para mim.

String myFile = "/Name Folder/File.jpg";  

String my_Path = Environment.getExternalStorageDirectory()+myFile;  

File f = new File(my_Path);
Boolean deleted = f.delete();
Denis IJCU
fonte
0
private boolean deleteFromExternalStorage(File file) {
                        String fileName = "/Music/";
                        String myPath= Environment.getExternalStorageDirectory().getAbsolutePath() + fileName;

                        file = new File(myPath);
                        System.out.println("fullPath - " + myPath);
                            if (file.exists() && file.canRead()) {
                                System.out.println(" Test - ");
                                file.delete();
                                return false; // File exists
                            }
                            System.out.println(" Test2 - ");
                            return true; // File not exists
                    }
Lâm Nguyễn Tuấn
fonte
Você precisa fornecer algumas explicações sobre o seu código! :)
Sanket Makani
Leia o arquivo getExternalStorageDirectory + adicione "/ Music /" é o meu caminho -> mypath = / storage / sdcard / Music /. Verifique se o arquivo existe ou se não existe e leia-o. excluir se existir. Isso exclui todas as músicas da lista no diretório Music
Lâm Nguyễn Tuấn
Adicione o mesmo à resposta! :)
Sanket Makani
0

Você pode excluir um arquivo da seguinte maneira:

File file = new File("your sdcard path is here which you want to delete");
file.delete();
if (file.exists()){
  file.getCanonicalFile().delete();
  if (file.exists()){
    deleteFile(file.getName());
  }
}
Makvin
fonte
-1
File filedel = new File("/storage/sdcard0/Baahubali.mp3");
boolean deleted1 = filedel.delete();

Ou tente isso:

String del="/storage/sdcard0/Baahubali.mp3";
File filedel2 = new File(del);
boolean deleted1 = filedel2.delete();
Laxman Ghuge
fonte
1
Ambos os seus exemplos são praticamente os mesmos. Além disso, a resposta mais votada diz exatamente para fazer isso. Não consigo ver o que mais esta resposta adiciona à pergunta. Além disso, isso não vai funcionar para arquivos em um armazenamento externo (como o cartão SD) de Kitkat Android em diante IIRC
Spikatrix