本次是给uniAPP开发原生插件的项目
在开发过程中发现,保存好自己app内截获的图片视频后,相册里面并没有,只有去文件夹里面找,站在产品的角度来讲这就对用户非常的不友好。所以需要通知相册去扫描我们保存文件的地方。
低版本API中常用的就是通过广播去更新,举个例子(代码来源于看过的帖子,后附地址链接):
String path = "文件路径";
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
Uri uri = Uri.fromFile(new File(path));
intent.setData(uri);
activity.sendBroadcast(intent);
(https://blog.csdn.net/xing_xiangrong/article/details/94602602)
这是我在低版本API中用到 方法,亲测可用,但是在高本版API中你会发现ACTION_MEDIA_SCANN
ER_SCAN_FILE已经被弃用。
但是我目前的插件项目是高版本API30(其实是自己nc把api设置为30),然后就出现了很多奇怪的问题。比如,以上方法就行不通。然后我在网上陆陆续续的查看了很多的类似方法,都没有实现。保存之后根本没法通知相册更新,在这里推荐一篇是我看到写的不错的文章,https://blog.csdn.net/xiayiye5/article/details/117221591
相信你们要问了,这文章行了吗?结果是:我按照这边文章测试了。文章的代码能跑起来,但是移到我的项目就不行!废话少说直接进入最终环节:
我就思考,上面那篇文基本我就是照着cv过来的,为什么不行?我一步一步排查,最终发现,我们存储的路径不一样。我是储存在getExternalFilesDir()的目录下,也就是android/data/data/包名下面。好,神奇事情来了。我果断猜测是android升级之后产生的问题,换一个API低于29的模拟器测试一下,果然相册成功刷新!!!
既然发现问题了,去查询官方文档!如下:
好了,API29也就是Android11强制分区,虽然官方建议存储外部文件到android/data/data/包名下面,但是存在到这个地方用MediaScannerConnection.scanFile()就找不到 无法通知相册进行更新了,没办法,只好自己用getExternalStorageDirectory()的方法在外部存储自己新建文件夹来存放(ps:主要在AndroidManifest里面设置 android:requestLegacyExternalStorage="true",不然你没办法访问 )。
总结:
1 没事别乱升级targetSdkVersion !!!
2 整件事就是因为getExternalFilesDir()创建的目录在高于29的机器上无法被媒体扫描器找到
3 总之我目前的办法就是把存储文件的路径换到外面来(非android/data/data/包名下面无法被访问的文件就行)。
4 android:requestLegacyExternalStorage="true"只对api29有用,低版本不需要,高版本不适用,只是用来过渡api29的,所以如果你的targetSdkVersion大于29,创建文件夹还是会失败,我也不知道怎么办了,后面我知道了会附上,暂时告一段落。
ps:希望知道的老哥回复一下。共同进步。
原文链接:https://blog.csdn.net/qq_37210897/article/details/119803043