A voir également:
- RenameTo et delete() ne marchent pas
- Hiberfil.sys delete - Guide
- Just delete me - Guide
- *#9900# delete dumpstate/logcat ✓ - Forum Samsung
- Kismia delete account - Forum Réseaux sociaux
- Delete doctor - Télécharger - Divers Utilitaires
7 réponses
BunoCS
Messages postés
15505
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
5 février 2025
3 913
26 juil. 2021 à 09:53
26 juil. 2021 à 09:53
Hello,
As-tu gérer correctement les permissions d'accès aux fichiers ?
As-tu gérer correctement les permissions d'accès aux fichiers ?
Hello, j'ai pris connaissance des nouvelles perms que nécessite android 11... Mon code marche très bien sur Android 10 et - mais il y a une nouvelle approche sur android 11.
il faut utiliser un pendingintent createDeleteRequest(https://developer.android.com/reference/android/provider/MediaStore#createDeleteRequest(android.content.ContentResolver,%20java.util.Collection%3Candroid.net.Uri%3E
Seulement, je ne sais pas comment récupérer le OnActivityResult pour supprimer mon fichier correctement en fonction du résultat.
Voilà mon code:
Merci !
il faut utiliser un pendingintent createDeleteRequest(https://developer.android.com/reference/android/provider/MediaStore#createDeleteRequest(android.content.ContentResolver,%20java.util.Collection%3Candroid.net.Uri%3E
Seulement, je ne sais pas comment récupérer le OnActivityResult pour supprimer mon fichier correctement en fonction du résultat.
Voilà mon code:
private void deleteFile(int p, View view){ AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle("Supprimer ?").setMessage(videoFolder.get(p).getTitle()).setNegativeButton("Annuler", (dialog, which) -> { }).setPositiveButton("Oui", (dialog, which) -> { ArrayList<Uri> fichiers = new ArrayList<>(); Uri contentUri = ContentUris.withAppendedId(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, Long.parseLong(videoFolder.get(p).getId())); File file = new File(videoFolder.get(p).getPath()); fichiers.add(contentUri); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { PendingIntent demande = MediaStore.createDeleteRequest(context.getContentResolver(), fichiers); try { ((Activity) context).startIntentSenderForResult(demande.getIntentSender(),1,new Intent(), 0,0,0); } catch (IntentSender.SendIntentException e) { e.printStackTrace(); } } boolean deleted = file.delete(); if (deleted){ context.getApplicationContext().getContentResolver().delete(contentUri, null, null); videoFolder.remove(p); notifyItemRemoved(p); notifyItemRangeChanged(p,videoFolder.size()); Snackbar.make(view, "Fichier supprimé avec succès", Snackbar.LENGTH_SHORT).show(); }else{ Snackbar.make(view, "Erreur, le fichier n'a pas été supprimé", Snackbar.LENGTH_SHORT).show(); } }).show(); }
Merci !
BunoCS
Messages postés
15505
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
5 février 2025
3 913
26 juil. 2021 à 14:09
26 juil. 2021 à 14:09
Extrait:
You can then determine if the user granted your request by testing for Activity#RESULT_OK in Activity#onActivityResultJe pense qu'il suffit d'utiliser la callback
onActivityResult()de l'Activity
je pense aussi mais je ne sais pas du tout comment l'implémenter
BunoCS
Messages postés
15505
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
5 février 2025
3 913
Modifié le 26 juil. 2021 à 15:01
Modifié le 26 juil. 2021 à 15:01
Quelque chose dans ce goût là:
Le switch peut être remplacé par un simple
@Override public void onActivityResult(final int requestCode, final int resultCode, final Intent data) { Log.d(this, "onActivityResult " + requestCode + " " + resultCode + " " + data); switch (requestCode) { case xxx: // je ne sais pas quel requestCOde cela peut être. A tester if (resultCode == Activity.RESULT_OK) { // ici retour avec succès de la requête de suppression } break; } super.onActivityResult(requestCode, resultCode, data); }
Le switch peut être remplacé par un simple
ifsi tu n'as pas de multiple combinaisons
oui je vois merci,
le problème c'est que je ne sais pas dans quel .java l'implémenter parce que je veux donc mettre mon code pour supprimer le fichier dans le OnActivityResult, sauf que dans mes activity je n'ai pas la variable qui correspond aux fichiers...
le problème c'est que je ne sais pas dans quel .java l'implémenter parce que je veux donc mettre mon code pour supprimer le fichier dans le OnActivityResult, sauf que dans mes activity je n'ai pas la variable qui correspond aux fichiers...
BunoCS
Messages postés
15505
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
5 février 2025
3 913
26 juil. 2021 à 15:35
26 juil. 2021 à 15:35
Elle est où ta variable ? Dans un Fragment ? Tu as la même callback:
https://developer.android.com/reference/android/app/Fragment#onActivityResult(int,%20int,%20android.content.Intent)
https://developer.android.com/reference/android/app/Fragment#onActivityResult(int,%20int,%20android.content.Intent)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Armczbt
Messages postés
8
Date d'inscription
lundi 26 juillet 2021
Statut
Membre
Dernière intervention
28 juillet 2021
Modifié le 26 juil. 2021 à 16:34
Modifié le 26 juil. 2021 à 16:34
Je vous mets l'organisation de mon code ainsi que tous les codes.
Ici, tout se passe dans videosadpater. Seulement, je suis obligé de mettre le OnActivityResult sur une activity mais je n'aurai pas le chemin de mon fichier.
![](https://img-19.ccm2.net/dF6ec8MmDQpozNVvjRovfoc3dTo=/440x/a2df00fd70944793b7b3d094f0757f56/ccm-ugc/Capture_decran_2021-07-26_155159.png)
MainActivity.java : https://textup.fr/570343Lh
VideoFolder.java : https://textup.fr/570345zd
VideoPlayer.java : https://textup.fr/570347Np
FolderAdapter : https://textup.fr/570348bE
VideosAdapter : https://textup.fr/570349F0
SplashScreen : https://textup.fr/570350AG
VideoModel : https://textup.fr/570351Ze
Ici, tout se passe dans videosadpater. Seulement, je suis obligé de mettre le OnActivityResult sur une activity mais je n'aurai pas le chemin de mon fichier.
![](https://img-19.ccm2.net/dF6ec8MmDQpozNVvjRovfoc3dTo=/440x/a2df00fd70944793b7b3d094f0757f56/ccm-ugc/Capture_decran_2021-07-26_155159.png)
MainActivity.java : https://textup.fr/570343Lh
VideoFolder.java : https://textup.fr/570345zd
VideoPlayer.java : https://textup.fr/570347Np
FolderAdapter : https://textup.fr/570348bE
VideosAdapter : https://textup.fr/570349F0
SplashScreen : https://textup.fr/570350AG
VideoModel : https://textup.fr/570351Ze
BunoCS
Messages postés
15505
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
5 février 2025
3 913
26 juil. 2021 à 16:52
26 juil. 2021 à 16:52
Tu peux le faire de plusieurs façon :
- implémenter une interface te permettant de passer des valeurs
- utiliser les Local Broadcasts
- implémenter une interface te permettant de passer des valeurs
- utiliser les Local Broadcasts
armczbt
>
BunoCS
Messages postés
15505
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
5 février 2025
26 juil. 2021 à 17:13
26 juil. 2021 à 17:13
Je suis désolé d'être aussi nul ... Je ne sais pas du tout ce que c'est ni comment faire
BunoCS
Messages postés
15505
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
5 février 2025
3 913
>
armczbt
27 juil. 2021 à 09:09
27 juil. 2021 à 09:09
Voici un tuto pour les interfaces : https://www.geeksforgeeks.org/how-to-create-interfaces-in-android-studio/
Pour le Broadcast, c'est ici : https://www.vogella.com/tutorials/AndroidBroadcastReceiver/article.html avec la doc officielle
Pour le Broadcast, c'est ici : https://www.vogella.com/tutorials/AndroidBroadcastReceiver/article.html avec la doc officielle
Armczbt
Messages postés
8
Date d'inscription
lundi 26 juillet 2021
Statut
Membre
Dernière intervention
28 juillet 2021
27 juil. 2021 à 09:31
27 juil. 2021 à 09:31
Merci pour le lien des tutos, j'ai rajouté :
à ma mainactivity, et maintenant j'aimerai implémenter OnActivityResult and l'adapter mais je ne sais comment faire...
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
à ma mainactivity, et maintenant j'aimerai implémenter OnActivityResult and l'adapter mais je ne sais comment faire...
BunoCS
Messages postés
15505
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
5 février 2025
3 913
27 juil. 2021 à 10:01
27 juil. 2021 à 10:01
PendingIntent demande = MediaStore.createDeleteRequest(context.getContentResolver(), fichiers); try { ((Activity) context).startIntentSenderForResult(demande.getIntentSender(),1,new Intent(), 0,0,0); } catch (IntentSender.SendIntentException e) { e.printStackTrace(); }
Le code ci-dessus, aujourd'hui dans ton adapter, doit être placé dans ton Activity: c'est elle qui doit lancer l'Intent pour pouvoir récupérer le résultat
Armczbt
Messages postés
8
Date d'inscription
lundi 26 juillet 2021
Statut
Membre
Dernière intervention
28 juillet 2021
>
BunoCS
Messages postés
15505
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
5 février 2025
27 juil. 2021 à 10:20
27 juil. 2021 à 10:20
BunoCS
Messages postés
15505
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
5 février 2025
3 913
>
Armczbt
Messages postés
8
Date d'inscription
lundi 26 juillet 2021
Statut
Membre
Dernière intervention
28 juillet 2021
27 juil. 2021 à 11:49
27 juil. 2021 à 11:49
Avec les méthodes que je t'ai indiquées ici
Armczbt
Messages postés
8
Date d'inscription
lundi 26 juillet 2021
Statut
Membre
Dernière intervention
28 juillet 2021
>
BunoCS
Messages postés
15505
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
5 février 2025
27 juil. 2021 à 11:59
27 juil. 2021 à 11:59
Tout d'abord vraiment un enorme merci de prendre du temps pour moi
Je ne comprends pas la logique à suivre. Que dois-je implémenter où ?
Je suis vraiment désolé de te poser des questions tout le temps mais là je nage dans quelque chose que je ne comprends pas....
Je ne comprends pas la logique à suivre. Que dois-je implémenter où ?
Je suis vraiment désolé de te poser des questions tout le temps mais là je nage dans quelque chose que je ne comprends pas....
BunoCS
Messages postés
15505
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
5 février 2025
3 913
>
Armczbt
Messages postés
8
Date d'inscription
lundi 26 juillet 2021
Statut
Membre
Dernière intervention
28 juillet 2021
27 juil. 2021 à 14:01
27 juil. 2021 à 14:01
Tu as le choix de faire ça "proprement" avec une interface par exemple.
Tu définis une interface de ce type:
Ensuite, tu implémentes cette interface dans ton Activity
Et dans ton Adapter, quelque chose comme ça:
Quelques remarques :
- je n'ai pas testé, j'ai juste codé dans le forum. Théroriquement, ça doit fonctionner mais je ne suis pas à l'abri d'une erreur de syntaxe
- il est bon de respecter des conventions de nommage : tous tes composants dérivant d'Activity doivent l'illustré dans le nom. Par exemple,
Tu définis une interface de ce type:
interface DeleteFileInterface { public void deleteFile(Uri fileUri); }
Ensuite, tu implémentes cette interface dans ton Activity
public class VideoFolder extends AppCompatActivity implements SearchView.OnQueryTextListener, DeleteFileInterface { public void loadVideos(){ videoModelArrayList = getallVideoFromFolder(this, name); if (name!=null && videoModelArrayList.size()>0){ videosAdapter = new VideosAdapter(videoModelArrayList, this, this); // CHANGEMENT ICI recyclerView.setAdapter(videosAdapter); recyclerView.setLayoutManager(new LinearLayoutManager(this, RecyclerView.VERTICAL, false)); }else { Toast.makeText(this, "Aucun fichier trouvé", Toast.LENGTH_SHORT).show();; } } @Override public void deleteFile(Uri fileUri) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { ArrayList<Uri> fichiers = new ArrayList<>(); fichiers.add(fileUri); PendingIntent demande = MediaStore.createDeleteRequest(context.getContentResolver(), fichiers); try { ((Activity) context).startIntentSenderForResult(demande.getIntentSender(), 1, new Intent(), 0, 0, 0); } catch (IntentSender.SendIntentException e) { e.printStackTrace(); } } }
Et dans ton Adapter, quelque chose comme ça:
public class VideosAdapter extends RecyclerView.Adapter<VideosAdapter.MyHolder> { public static ArrayList<VideoModel> videoFolder = new ArrayList<>(); private final Context context; private DeleteFileInterface listener; public VideosAdapter(ArrayList<VideoModel> videoFolder, Context context, DeleteFileInterface listener) { VideosAdapter.videoFolder = videoFolder; this.context = context; this.listener = listener; } private void deleteFile(int p, View view){ AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle("Supprimer ?").setMessage(videoFolder.get(p).getTitle()).setNegativeButton("Annuler", (dialog, which) -> { }).setPositiveButton("Oui", (dialog, which) -> { ArrayList<Uri> fichiers = new ArrayList<>(); Uri contentUri = ContentUris.withAppendedId(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, Long.parseLong(videoFolder.get(p).getId())); File file = new File(videoFolder.get(p).getPath()); fichiers.add(contentUri); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { if (listenet != null) { listener.deleteFile(contentUri); } }else{ boolean deleted = file.delete(); if (deleted){ context.getApplicationContext().getContentResolver().delete(contentUri, null, null); videoFolder.remove(p); notifyItemRemoved(p); notifyItemRangeChanged(p,videoFolder.size()); Snackbar.make(view, "Fichier supprimé avec succès", Snackbar.LENGTH_SHORT).show(); }else{ Snackbar.make(view, "Erreur, le fichier n'a pas été supprimé", Snackbar.LENGTH_SHORT).show(); } } }).show(); }
Quelques remarques :
- je n'ai pas testé, j'ai juste codé dans le forum. Théroriquement, ça doit fonctionner mais je ne suis pas à l'abri d'une erreur de syntaxe
- il est bon de respecter des conventions de nommage : tous tes composants dérivant d'Activity doivent l'illustré dans le nom. Par exemple,
VideoFolderdevient
VideoFolderActivity.
Armczbt
Messages postés
8
Date d'inscription
lundi 26 juillet 2021
Statut
Membre
Dernière intervention
28 juillet 2021
27 juil. 2021 à 14:53
27 juil. 2021 à 14:53
Ok, ta solution marche !
Seulement je ne sais pas comment l'adapter à ma fonction rename. Le createDeleteRequest supprime sans attendre une réponse particulière donc ça va, seulement pour renommer je pensais utiliser le createWriteRequest, sauf que je ne sais pas comment faire la suite...
Seulement je ne sais pas comment l'adapter à ma fonction rename. Le createDeleteRequest supprime sans attendre une réponse particulière donc ça va, seulement pour renommer je pensais utiliser le createWriteRequest, sauf que je ne sais pas comment faire la suite...