我正在更新我的应用程序以使用 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,然后使用相同的 uri 将getContentResolver().delete()
其删除,onActivityResult()
然后成功删除。
无论哪种方式,该项目都会从 MediaStore 中删除,并且在我查询 MediaStore 以获取图像时或在其他应用程序中都不会显示在结果中。
但此文件存在于文件系统上(使用 SAF 和各种文件管理器(Google Files、Total Commander)检查)
有时(取决于 Android 版本和媒体类型)这些项目会在手机重新启动后(或打开 Google 相册后 - 它会扫描文件系统)带回 MediaStore
例如:我的 Google Pixel 和 Google Pixel 3a XL 上的 Android 10 的行为与上述图像/视频/音频的行为相同,但小米 Mi A2 Lite 上的 Android 9 仅对音频文件的行为如此,而删除图像/视频则很好。
我有android:requestLegacyExternalStorage="false"
清单。
有没有办法强制 MediaStore 也删除文件系统上的数据?为什么文件系统上的文件被遗忘了?