1

J'ai eu du mal à renommer un DocumentFile sur Lollipop. Je suis désolé d'avoir essayé de chercher partout la solution, mais il semble y avoir un manque d'information en ligne sur cette nouvelle API d'accès à la carte SD.Android 5.0+ Nouvelle API d'accès à la carte SD DocumentFile.renameTo() UnsupportedOperationException

Voici ce que j'ai:

 String EditText = (Alert_EditText.getText().toString()).trim(); 
     Uri uri = ListViewObject_List.get(LastItemPos).getImageUri(); 
     final DocumentFile documentFile = DocumentFile.fromSingleUri(MainClass.this, uri); 
     documentFile.renameTo(EditText); 

Il est venu avec un UnsupportedOperationException:

FATAL EXCEPTION: main 
Process: com.camera.test, PID: 3362 
java.lang.UnsupportedOperationException 
at android.support.v4.provider.SingleDocumentFile.renameTo(SingleDocumentFile.java:105) 
at com.camera.test.MainClass$21.onClick(MainClass.java:986) 
at android.view.View.performClick(View.java:5242) 
at android.widget.TextView.performClick(TextView.java:10530) 
at android.view.View$PerformClick.run(View.java:21185) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:145) 
at android.app.ActivityThread.main(ActivityThread.java:6872) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199) 

J'ai aussi essayé:

String EditText = (Alert_EditText.getText().toString()).trim(); 
    Uri uri = ListViewObject_List.get(LastItemPos).getImageUri(); 
    File file = new File(uri.getPath()); 
    final DocumentFile documentFile = DocumentFile.fromFile(file); 
    documentFile.renameTo(EditText);  

Il ne semble pas faire quelque chose: pas d'erreur, rien ne s'est passé ...

....

.... je peux supprimer le DocumentFile très bien ce qui suit:

Uri uri = ListViewObject_List.get(LastItemPos).getImageUri(); 
final DocumentFile documentFile = DocumentFile.fromSingleUri(MainClass.this, uri); 
documentFile.delete(); 

Quelqu'un peut-il s'il vous plaît jeter un coup d'oeil et voir ce que je fait de mal?

Merci beaucoup pour votre gentillesse et votre aide.

Mise à jour: cette uri est

content://com.android.externalstorage.documents/tree/0000-0000%3APictures%2FTest1/document/0000-0000%3APictures%2FTest1%2FMyPicture.jpg 

Répondre

2

renameTo() n'est pas pris en charge pour un DocumentFile créé à partir fromSingleUri(). Vous pouvez essayer DocumentContract.renameDocument(getContentResolver(), uri, theNewDisplayName). getContentResolver() est une méthode sur Context pour obtenir un ContentResolver. Notez que cela modifie le nom d'affichage; l'interprétation de "nom d'affichage" appartient au fournisseur de document. En outre, tous les fournisseurs ne prennent pas en charge le changement de nom des documents, ce qui peut ou non fonctionner. Notez que le fournisseur d'accès au stockage n'est pas une "API d'accès à la carte SD". C'est une API de document. Ces documents proviennent d'un fournisseur de documents choisi par l'utilisateur, qui peut ou non impliquer un stockage amovible.

+0

Merci beaucoup pour votre aide. Donc, fondamentalement, je dois parcourir le répertoire parent pour rechercher le fichier que j'essaye de supprimer. Ehh, ça ne prendrait pas un moment quand j'ai plus de 200 000 images? Je n'ai aucune idée sur le DocumentsProvider.Contract. pouvez-vous l'expliquer un peu plus? Cela craint que je ne puisse pas utiliser documentFile.renameTo() :-( – Dante

+0

@Dante: Mon erreur, je regardais la classe 'DocumentProvider', ce qui est faux (c'est l'implémentation d'un fournisseur de document).' DocumentContract' a une méthode 'renameDocument()' que vous pouvez essayer - voir ma réponse corrigée – CommonsWare

+0

Génial, vous êtes juste un génie J'ai passé des jours à essayer de comprendre et de chercher en ligne Je ne peux pas vous remercier assez mon ami. – Dante