PictureSelector 2.0 Android Q 适配之旅。

PictureSelector 至从2016年12月底提交第一个版本以来时至今日总共也已提交80多个版本,经过不断的改良和适配现在也相对趋于稳定了并在Github上收获超7900个star,再这也要感谢各位同学的鼓励和提供的一些意见。

由于Google Android Q正式版预计在2019年8月份前后推出,所以针对AndroidQ的适配已经迫在眉睫了,其中Android Q一项比较重要的变更就是在外部存储设备中为每个应用提供了一个“隔离存储沙盒”。任何其他应用都无法直接访问您应用的沙盒文件,由于文件是您应用的私有文件,因此您不再需要任何权限即可在外部存储设备中访问和保存自己的文件。
由于PictureSelector是一款图片选择器所以自然只对存储这一块需要适配,如您需要了解更多Q相关的特性请参考 官网地址

先介绍一下沙盒机制下的三种存储方式

1、context.getExternalFilesDir(Environment.DIRECTORY_PICTURES);// 图片存储路径
2、context.getExternalFilesDir(Environment.DIRECTORY_MOVIES);// 视频存储路径
3、context.getExternalFilesDir(Environment.DIRECTORY_DIRECTORY_MUSIC);//音频存储路径

作为一款图片选择器,沙盒机制这个操作对PictureSelector肯定是影响比较大,为了验证有哪些问题方便适配我们把targetSdkVersion改成>=29然后在Q版本机型上运行后发现果然PictureSelector基本是处于不能使用的尴尬局面,然后也收到了很多小伙伴发来的邮件和信息报bug那么废话就不多说了,下面就讲一下PictureSelector 2.0是如何适配Android Q;问题一、图片加载失败无法正常显示图片 因为MediaStore.MediaColumns.DATA 字段在Q版本被标记已过时,原因上面有提到过任何其他应用都无法直接访问您应用的沙盒文件;所以在Q上此字段返回的类似/storage/emulated/0/DCIM/Camera/IMG_20200105_19064545.jpg将无权限访问,即使你用Glide这些优秀的第三方框架也显示失败,你在Logcat过滤一下Glide日志就会发现会报如下异常:
```java.io.FileNotFoundException: open failed: EACCES (Permission 
    denied) ```意思是找不到文件&无权限访问
    
这个解决方案也很简单我们只需要通过``` MediaStore.Files.FileColumns._ID```拿到资源的Id进行拼接转成Uri的方式content://media/external/file/20246就能正常显示图片,代码如下:

  long id = data.getLong(data.getColum
  • 12
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 20
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值