我正在更新我的应用程序,以使用在Android 10中引入的Scoped Storage功能。
我的应用程序与MediaStore一起工作,显示图像、视频和音频文件,并提供用户删除项目的功能。
我之前删除文件所做的操作:
- 从
MediaStore.MediaColumns.DATA
获取路径 - 使用
new File(path).delete()
删除该文件 - 手动更新MediaStore
现在,由于MediaStore.MediaColumns.DATA不可用,我迁移到使用ContentResolver.delete()从MediaStore中删除项。
例如,我有一个项的uri:content://media/external/images/media/502
(它是有效的uri,我在网格中显示其缩略图)。无论是我插入这个项到MediaStore还是其他应用程序插入,都不重要。
我使用context.getContentResolver().delete(uri, null, null)
。它要么成功删除(返回1行),要么捕获RecoverableSecurityException
,使用startIntentSenderForResult()
来访问当前uri,然后在onActivityResult()
中使用相同的getContentResolver().delete()
删除它并且然后成功删除。
但是,这个文件仍然存在于文件系统中(使用SAF和各种文件管理器(Google文件、Total Commander)进行检查)。
有时(取决于Android版本和媒体类型),这些项目在手机重启后(或在打开Google照片后-它会扫描文件系统)会被带回MediaStore。
例如:我的Google Pixel和Google Pixel 3a XL上的Android 10针对Images/Videos/Audio的行为与上述描述相同,但Xiaomi Mi A2 Lite上的Android 9仅在Audio文件中表现出这种行为,而在删除图像/视频方面表现良好。
我在清单中有android:requestLegacyExternalStorage="false"。
有没有一种方法可以强制MediaStore也在文件系统上删除数据?为什么文件在文件系统中会被留下?