Android 5.0+ 新增 SD 卡访问 API DocumentFile.renameTo() UnsupportedOperationException

Dan*_*nte 2 android file-rename android-sdcard android-external-storage

我一直在努力研究如何在 Lollipop 上重命名 DocumentFile。很抱歉,我曾试图到处搜索解决方案,但似乎缺少有关此新 SD 卡访问 API 的在线信息。

这是我所拥有的:

        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);
Run Code Online (Sandbox Code Playgroud)

它提出了一个 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)
Run Code Online (Sandbox Code Playgroud)

我也试过这个:

    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);    
Run Code Online (Sandbox Code Playgroud)

它似乎什么也没做:没有错误,什么也没发生……

....

.... 我可以删除 DocumentFile 就好了,如下所示:

Uri uri = ListViewObject_List.get(LastItemPos).getImageUri();
final DocumentFile documentFile = DocumentFile.fromSingleUri(MainClass.this, uri);
documentFile.delete();
Run Code Online (Sandbox Code Playgroud)

有人可以看看它,看看我做错了什么吗?

非常感谢您的好意和帮助。

更新:这个uri是

content://com.android.externalstorage.documents/tree/0000-0000%3APictures%2FTest1/document/0000-0000%3APictures%2FTest1%2FMyPicture.jpg
Run Code Online (Sandbox Code Playgroud)

Com*_*are 6

renameTo()不支持DocumentFilefromSingleUri().

你可以试试DocumentsContract.renameDocument(getContentResolver(), uri, theNewDisplayName)getContentResolver()是一种Context获得ContentResolver. 请注意,这会更改显示名称;“显示名称”的解释取决于文档提供者。此外,并非所有提供商都支持重命名文档,因此这可能有效,也可能无效。

请注意,存储访问提供程序不是“SD 卡访问 API”。它是一个文档 API。这些文档来自用户选择的文档提供者,可能涉及也可能不涉及可移动存储。