FileProvider(Failed to find configured root that contains)

一问题背景

   最近项目app发布新版本,通过bugly后台发现,在调用系统相册的功能处会出现崩溃“failed to find configured root that contains xxx”,赶紧找来手机测测,发现没问题呀,又多找了几部手机试试,发现也是ok的呀,然后对比报错的系统版本是Android7.0–9.0,而且不是一部机型有问题,应该跟机型没关系,相应的又找了7.0–9.0的系统来试,发现也是ok。怎么办呢?

二问题分析

   从日志信息来看,应该是路径配置有问题,然后发现路径配置的也没问题,就去网上搜,网上确实能搜到一波遇到同样问题的同学,比较多的问题是增加root-path标签,但是经过仔细研究,这个标签是应用于外部sd卡存储设备的,而我们访问的是外部存储,使用exteranl-path应该是没问题的,再次陷入僵局。

    好在有个同事的手机上能够出现这个崩溃,这就给我们能够大量的试错提供了条件,经过多次调试,终于找到了问题的关键,请看下图:

调用Fileprovider.getUriForFile最终会走到上图这个方法,请看图中画圈的地方,provider内部有缓存处理,如果缓存找到,则不会在查找,而作为缓存的key是 authority,这样说来,authority是唯一标示一个provider的关键信息,不能重复,现在肯定是工程内部存在多个一样authority的provider。最终验证现实果然如此

三总结

关键问题是如何能够定位到原因?反思下整个过程,一开始就追着路径书写配置方面去查找了,这个方向其实是有问题的,但报错信息确实就是提示:路径不对。很容易就会朝着这个方向去走,如果没有复现此问题的手机,基本就会通过修改路径来观察。关键就是通过调试和源码分析定位到了问题。启发:

1、首先应该明白基本原理。比如本次问题的fileprovider,平时用的很少,基本是使用的时候才会去网上搜搜,看怎么配置,怎么写调用代码,然后能使用了就ok了。出了问题呢,则会专注到问题点上去排查。如此则会导致方向一旦走错,则浪费很大精力,而且不能全面把控问题。比较省力的方式是首先知晓原理,比如provider的使用比较多的其实是配置在androidmanifes的部分,通过指定路径,定义authority,指定类名,来标示一个特定provider,那么authority就很重要,再通过源码去确认

1、最好复现问题才能验证修改是否有效

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值