PPTing / ppting.github.io

2 stars 0 forks source link

Android MediaStore Api 使用 - PPTing's Blog #3

Open PPTing opened 2 years ago

PPTing commented 2 years ago

https://ppting.me/2020/04/19/2020_04_19_how_to_use_Android_MediaStore_Api/#more

本文是对 关于 Android 的文件存储目录的补充 在 Android Q 后,获得 External Storage 的权限后 使用 Environment.getExternalStorageDirectory 和 File Api 对外置存储中的文件进行操作 这种方式已经不被允许了,需要开发者进行适配,后续开发者需要通过 Storage Access Framework 或者 Me

zhangjianhd commented 2 years ago

请问两个问题:

PPTing commented 2 years ago

@zhangjianhd 请问两个问题:

  • 使用相同的MediaStore.MediaColumns.DISPLAY_NAME并且MediaStore.MediaColumns.RELATIVE_PATH也相同时,连续insert的时候如何覆盖当前文件而不是交给系统自动在文件后加(1)的后缀;
  • 当在文件管理里面主动删除该文件后(放在共享文件夹Pictures下面),再以相同的MediaStore.MediaColumns.DISPLAY_NAME去insert,返回的uri始终是null,这个如何处理

Hi 第一个问题,可以先查询目录下是否存在同名的文件,如果存在,先删除后插入,这里有个类似的问题和回答供你参考:https://stackoverflow.com/questions/60632273/mediastore-contentresolver-insert-creates-copies-instead-of-replacing-the-exis

第二个问题我尝试了一下,没有复现,可否提供下你的简易代码

zhangjianhd commented 2 years ago

@zhangjianhd 请问两个问题:

  • 使用相同的MediaStore.MediaColumns.DISPLAY_NAME并且MediaStore.MediaColumns.RELATIVE_PATH也相同时,连续insert的时候如何覆盖当前文件而不是交给系统自动在文件后加(1)的后缀;
  • 当在文件管理里面主动删除该文件后(放在共享文件夹Pictures下面),再以相同的MediaStore.MediaColumns.DISPLAY_NAME去insert,返回的uri始终是null,这个如何处理

Hi 第一个问题,可以先查询目录下是否存在同名的文件,如果存在,先删除后插入,这里有个类似的问题和回答供你参考:https://stackoverflow.com/questions/60632273/mediastore-contentresolver-insert-creates-copies-instead-of-replacing-the-exis

第二个问题我尝试了一下,没有复现,可否提供下你的简易代码

多谢了,尝试这种方案是可行的。 同时第二个问题也不存在了。可能是文件管理器直接删除这个图片并没有从Media数据库中删除这条数据,但是文件本身却被删除了,最后insert返回的uri一直是null,具体原因没有去排查了(测试设备是小米MIX2s,安卓10,miui12.5。不知道是不是miui上面自带的文件管理器的bug)。

zhangjianhd commented 2 years ago

@zhangjianhd 请问两个问题:

  • 使用相同的MediaStore.MediaColumns.DISPLAY_NAME并且MediaStore.MediaColumns.RELATIVE_PATH也相同时,连续insert的时候如何覆盖当前文件而不是交给系统自动在文件后加(1)的后缀;
  • 当在文件管理里面主动删除该文件后(放在共享文件夹Pictures下面),再以相同的MediaStore.MediaColumns.DISPLAY_NAME去insert,返回的uri始终是null,这个如何处理

Hi 第一个问题,可以先查询目录下是否存在同名的文件,如果存在,先删除后插入,这里有个类似的问题和回答供你参考:https://stackoverflow.com/questions/60632273/mediastore-contentresolver-insert-creates-copies-instead-of-replacing-the-exis

第二个问题我尝试了一下,没有复现,可否提供下你的简易代码

我又测试了下: 在安卓10(安卓12不会)下,即使先查询再插入,第二个问题任然在的,只要在Pictures文件夹下删除下级文件夹,比如我的RELATIVE_PATH配置的是:

Environment.DIRECTORY_PICTURES+"${File.separator}MediaStore${File.separator}temp"

即:放在"/Pictures/MediaStore/temp"文件夹下面,只要删除MediaStore文件夹或者temp文件夹,后面保存相同的DISPLAY_NAME就总是保存失败的了(是相同的name的才会失败,如果用时间戳作为名字这种没关系),直接删除文件本身现在不会失败了。

代码地址 关键方法MediaSaver#saveImage

PPTing commented 2 years ago

@zhangjianhd

@zhangjianhd 请问两个问题:

  • 使用相同的MediaStore.MediaColumns.DISPLAY_NAME并且MediaStore.MediaColumns.RELATIVE_PATH也相同时,连续insert的时候如何覆盖当前文件而不是交给系统自动在文件后加(1)的后缀;
  • 当在文件管理里面主动删除该文件后(放在共享文件夹Pictures下面),再以相同的MediaStore.MediaColumns.DISPLAY_NAME去insert,返回的uri始终是null,这个如何处理

Hi 第一个问题,可以先查询目录下是否存在同名的文件,如果存在,先删除后插入,这里有个类似的问题和回答供你参考:https://stackoverflow.com/questions/60632273/mediastore-contentresolver-insert-creates-copies-instead-of-replacing-the-exis

第二个问题我尝试了一下,没有复现,可否提供下你的简易代码

我又测试了下: 在安卓10(安卓12不会)下,即使先查询再插入,第二个问题任然在的,只要在Pictures文件夹下删除下级文件夹,比如我的RELATIVE_PATH配置的是:

Environment.DIRECTORY_PICTURES+"${File.separator}MediaStore${File.separator}temp"

即:放在"/Pictures/MediaStore/temp"文件夹下面,只要删除MediaStore文件夹或者temp文件夹,后面保存相同的DISPLAY_NAME就总是保存失败的了(是相同的name的才会失败,如果用时间戳作为名字这种没关系),直接删除文件本身现在不会失败了。

  • 测试了一台小米MIX2s一台华为,都是安卓10的机型,均有这个问题
  • 在另一台安卓12的小米10上不存在这个问题,能正常保存。

代码地址 关键方法MediaSaver#saveImage

Hi 我用你的代码在我的 三星S10(One UI 4.0/Android 12) 和 Android Studio 的模拟器( Pixel Android 10) 用你所描述的方式删除文件、删除文件夹的方式后,后序都是可以正常保存图片的。手头暂时没有小米和华为的 Android 10 机器,等我再找机器看一会 ~