Android 11.0:如何通过存储访问框架删除文件?

3

我正在尝试通过文件Uri删除文件,但我不知道如何为此文件添加标志(我是Android新手)。

我的应用程序管理媒体文件和其他文件。

我已经按照Mediastore API文档的说明成功删除了媒体文件。但对于其他文件,则需要使用存储访问框架。

因此,我会像这样获取文件的Uri:

Uri contentUri = ContentUris.withAppendedId(MediaStore.Files.getContentUri(MediaStore.VOLUME_EXTERNAL), id);

然后我想像这样删除它:

DocumentsContract.deleteDocument(getContentResolver(), uri);

然而,它不起作用是因为我没有将FLAG_SUPPORTS_DELETE添加到文件中。而我不知道如何做到这一点。

我已经多次阅读了存储访问框架文档以及stackoverflow上的各种帖子,但我没有找到任何可以帮助我的东西(我是Android新手)。


@CommonsWare我不明白为什么我的方法行不通。如果我使用MediaStore API或存储访问框架访问URI,它仍然保持不变?除了使用Mediastore API删除非媒体文件之外,还有什么其他方法吗?要删除我的媒体文件,我使用以下代码:PendingIntent removePI = MediaStore.createDeleteRequest(getContentResolver(), currentSelectedFiles); startIntentSenderForResult(removePI.getIntentSender(), DELETE_REQUEST, null, 0, 0, 0, null); 然而,当我尝试使用此代码删除非媒体文件时,我收到一个错误,告诉我只能删除媒体文件。 - Antoine Hazebrouck
1
“如果我使用MediaStore API或存储访问框架访问URI,它仍然保持不变吗?” - 不完全是这样。这相当于说,因为您对自己的Web服务器具有管理员访问权限,所以您必须也对Facebook具有管理员访问权限,因为它们都使用https URL。 “当我尝试使用此代码删除非媒体文件时,我会收到一个错误,告诉我只能删除媒体文件” - 然后使用ACTION_OPEN_DOCUMENTACTION_OPEN_DOCUMENT_TREEDocumentFile来使用存储访问框架。 - CommonsWare
“使用MediaStore API无法删除非媒体文件吗?”--坦白地说,我从未尝试过。 - CommonsWare
类似 MediaStore.convert..... 或 .to... 的内容 - blackapps
@CommonsWare @blackapps 如果我理解正确的话,在 android 11.0 下删除非媒体文件,我必须通过存储访问框架进行操作?还是有其他方法?请注意,我也拥有该文件的路径。 - Antoine Hazebrouck
显示剩余5条评论
1个回答

0
经过大量的研究,我终于找到了解决问题的方法。
我的应用程序旨在通过用户界面列出所有重复文件,并将它们删除。
对于媒体文件,我没有遇到任何大问题,Mediastore API 相对容易使用。
然而,对于非媒体文件来说,情况就非常复杂了。事实上,我首先通过 Mediastore API 成功地列出了这些文件,但很快意识到无法使用该 API 删除它们。
因此,我选择了 saf(存储访问框架),但在多次阅读文档后,我发现无法访问下载目录。而这个目录对于我的应用程序正常运行至关重要。
接着,我尝试结合 Mediastore API 和 File API。我通过 Mediastore 获取了文件路径,并通过 File API 将其删除。然而,有一个小问题,这些文件虽然已经从我的应用程序中成功删除,但我仍然可以通过 Google 的 Files 应用程序访问和查看它们。
陷入困境,我不知道该怎么办。作为 Android 新手,我没有经验(这是我制作的第一个应用程序)。但我还是找到了一个“技巧”来删除非媒体文件:
getContentResolver().delete(path, null, null);

这行代码允许我删除一个文件(无论是从我的应用程序还是从谷歌的文件应用程序中)。然而,我不知道这是否是一种不好的做法或者根本不是。我还看到我可以使用这个来删除一个文件:
getApplicationContext().deleteFile(filename);

但我仍然不知道这是否是一种不好的做法。

以下是我解决这个问题的过程:如何删除非媒体文件而不使用saf(存储访问框架)(因为无法访问下载目录)?

如果您有任何评论、建议或其他方面的意见,我很感兴趣。我也很好奇您是否有其他技巧来解决我的问题,以及我的解决方案是好还是坏。

请宽容一点,我是新手,只在Android 11(Android R)上编码。

非常感谢您的阅读。


这个问题是关于路径和文件名是否是URI,还是只是从getexternalstorage获取的路径。 - J. M.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接