RenameTo et delete() ne marchent pas

Signaler
-
 Armczbt -
Bonjour,

aucune de mes procédures pour renommer le fichier et le supprimer ne marche...

le boolean supp = file.delete(); est toujours faux, je ne comprends pas pourquoi....

Voici ma procédure de suppression :
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) -> {
                        Uri contentUri = ContentUris.withAppendedId(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, Long.parseLong(videoFolder.get(p).getId()));
                        File file = new File(videoFolder.get(p).getPath());
                        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

Configuration: Windows / Chrome 92.0.4515.107

7 réponses

Messages postés
15134
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
16 septembre 2021
3 633
Hello,

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:
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 !
Messages postés
15134
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
16 septembre 2021
3 633
Extrait:
You can then determine if the user granted your request by testing for Activity#RESULT_OK in Activity#onActivityResult
Je 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
Messages postés
15134
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
16 septembre 2021
3 633
Quelque chose dans ce goût là:
    @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
if
si 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...
Messages postés
15134
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
16 septembre 2021
3 633
Messages postés
8
Date d'inscription
lundi 26 juillet 2021
Statut
Membre
Dernière intervention
28 juillet 2021

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.




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
Messages postés
15134
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
16 septembre 2021
3 633
Tu peux le faire de plusieurs façon :
- implémenter une interface te permettant de passer des valeurs
- utiliser les Local Broadcasts
>
Messages postés
15134
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
16 septembre 2021

Je suis désolé d'être aussi nul ... Je ne sais pas du tout ce que c'est ni comment faire
Messages postés
15134
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
16 septembre 2021
3 633 > armczbt
Messages postés
8
Date d'inscription
lundi 26 juillet 2021
Statut
Membre
Dernière intervention
28 juillet 2021

Merci pour le lien des tutos, j'ai rajouté :
@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...
Messages postés
8
Date d'inscription
lundi 26 juillet 2021
Statut
Membre
Dernière intervention
28 juillet 2021
>
Messages postés
15134
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
16 septembre 2021

J'ai une erreur de build "Unable to instantiate activity". C'est apparemment lié à la déclaration dans le manifest mais je ne sais pas quoi rajouter
Messages postés
8
Date d'inscription
lundi 26 juillet 2021
Statut
Membre
Dernière intervention
28 juillet 2021
>
Messages postés
15134
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
16 septembre 2021

Re, je ne sais toujours pas comment avoir le OnActivityResult...
Messages postés
15134
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
16 septembre 2021
3 633 >
Messages postés
8
Date d'inscription
lundi 26 juillet 2021
Statut
Membre
Dernière intervention
28 juillet 2021

Tu lances bien le PendingIntent depuis l'Activity ? Tu as implémenté le onActivityResult dans cette Activity ?
>
Messages postés
15134
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
16 septembre 2021

Oui c'est bon en fait, je me suis débrouillé. Je cherche toujours comment rename car cela ne marche toujours pas...
> Armczbt
https://stackoverflow.com/questions/68561828/java-files-move-doesnt-work-operation-not-permitted je l'ai posté ici mon problème, j'ai modifié mon approche. J'ai décidé d'essayer de le faire avec la library Files mais ça ne marche pas non plus...
Messages postés
8
Date d'inscription
lundi 26 juillet 2021
Statut
Membre
Dernière intervention
28 juillet 2021

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...