Je crée un fichier à envoyer en pièce jointe à un courrier électronique. Maintenant, je veux supprimer l'image après l'envoi de l'e-mail. Est-il possible de supprimer le fichier?
J'ai essayé myFile.delete();
mais le fichier n'a pas été supprimé.
J'utilise ce code pour Android. Le langage de programmation est donc Java en utilisant les méthodes habituelles Android pour accéder à la carte SD. Je supprime le fichier avec la méthode onActivityResult
lorsqu'un fichier Intent
est renvoyé à l'écran après l'envoi d'un courrier électronique.
File file = new File(selectedFilePath);
boolean deleted = file.delete();
où selectedFilePath est le chemin du fichier que vous voulez supprimer - par exemple:
/sdcard/YourCustomDirectory/ExampleFile.mp3
De plus, vous devez donner votre permission si vous utilisez> 1.6 SDK
uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"
dans le fichier AndroidManifest.xml
Les applications ne sont pas autorisées à écrire ( supprimer, modifier ...) dans stockage externe sauf dans leurs répertoires spécifiques au paquet .
Comme Android, la documentation indique:
"Les applications ne doivent pas être autorisées à écrire sur des périphériques de stockage externes secondaires, sauf dans leurs répertoires spécifiques au package, comme le permettent les autorisations synthétisées."
Cependant cette solution de contournement existe (voir le code ci-dessous) . Testé sur Samsung Galaxy S4, mais ce correctif ne fonctionne pas sur tous les appareils. De plus, je ne compterais pas sur cette solution de contournement étant disponible dans versions futures d'Android.
Il y a un excellent article expliquant le changement des autorisations de stockage externe (4.4+) .
Vous pouvez lire plus d'informations sur la solution de contournement ici . Le code source de cette solution provient de ce 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;
}
}
Le contexte Android a la méthode suivante:
public abstract boolean deleteFile (String name)
Je crois que cela va faire ce que vous voulez avec les bonnes prémissions App énumérées ci-dessus.
Supprimer récursivement tous les enfants du fichier ...
public static void DeleteRecursive(File fileOrDirectory)
{
if (fileOrDirectory.isDirectory())
{
for (File child : fileOrDirectory.listFiles())
{
DeleteRecursive(child);
}
}
fileOrDirectory.delete();
}
Cela fonctionne pour moi: (Supprimer l'image de la galerie)
File file = new File(photoPath);
file.delete();
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File(photoPath))));
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());
}
Ce code vous aidera .. Et dans Android Manifeste, vous devez obtenir la permission de le modifier ..
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>
Essaye ça.
File file = new File(FilePath);
FileUtils.deleteDirectory(file);
d'Apache Commons
Désolé, il y a une erreur dans mon code auparavant à cause de la validation du site.
String myFile = "/Name Folder/File.jpg";
String myPath = Environment.getExternalStorageDirectory()+myFile;
File f = new File(myPath);
Boolean deleted = f.delete();
Je pense que c'est clair ... Vous devez d'abord connaître l'emplacement de votre fichier. Deuxièmement , Environment.getExternalStorageDirectory()
est une méthode qui récupère votre répertoire d'applications. Enfin, la classe File qui gère votre fichier ...
J'ai eu un problème similaire avec une application fonctionnant sur 4.4. Ce que j'ai fait était en quelque sorte un bidouillage.
J'ai renommé les fichiers et les ai ignorés dans mon application.
c'est à dire.
File sdcard = Environment.getExternalStorageDirectory();
File from = new File(sdcard,"/ecatAgent/"+fileV);
File to = new File(sdcard,"/ecatAgent/"+"Delete");
from.renameTo(to);
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
}
Vous pouvez supprimer un fichier comme suit:
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());
}
}
Cela a fonctionné pour moi.
String myFile = "/Name Folder/File.jpg";
String my_Path = Environment.getExternalStorageDirectory()+myFile;
File f = new File(my_Path);
Boolean deleted = f.delete();