> 文档中心 > Failed to find provider info for xxx,Unknown URL content 的问题归因和解决办法

Failed to find provider info for xxx,Unknown URL content 的问题归因和解决办法


1.问题背景

    在学习《安卓第一行代码》第三版关于ContentProvider的内容时,出现了无法找到provider Uri的问题,导致没有办法执行后续insert、update等方法。为了避免大家踩坑,做一些小记录。

2.问题归因

    出现这种情况的原因主要是有以下几种:

  1. 未勾选复选框
        在使用AndroidStudio生成自定义ContentProvider的时候,未勾选Enable和Exported选项,导致自定义的ContentProvider无法被其他应用程序访问:
    一定要记得勾选
  2. 拼写问题
        在定义Authorities的时候,拼写的单词有误,导致外部访问程序输入的Uri没办法匹配(手残打错一个字母就会匹配不上):
        下面这种情况就是自己手残打错了一个字母,就没办法匹配,但这种情况毕竟是少数
    Failed to find provider info for xxx,Unknown URL content 的问题归因和解决办法
    Failed to find provider info for xxx,Unknown URL content 的问题归因和解决办法
  3. 权限问题
        这也是我遇到的情况,再检查代码无误并且勾选对应的复选框后,仍旧是报错找不到Uri,这个时候其实就意识到有可能是我的模拟器版本太高的原因造成的(我用的API32的模拟器),经过网上一番查找后,找到了一个大佬写的文章,文章中提到是因为版本太高,程序之间的交互方式出现变化,按照大佬的第一种解决方式,即明确交互的应用程序,解决了问题。
    解决方案

后续思考

    问题虽然得到解决,但是顺着大佬给出的原因我自己做了进一步的查询,在文章API30适配中找到了关于具体交互方式变化的地方,从API30开始,app将不能感知/data/data/com.another.app等目录的存在,即便是已经安装好,同时文章中也给出了三种适配解决方案,分别是:
● 声明要交互特定的app

   ......               ......

● 声明要交互能响应特定intent的apps

   ......           ......

● 声明要交互所有的app

申请新权限:android.permission.QUERY_ALL_PACKAGES。

    QUERY_ALL_PACKAGES权限等级为normal,app申请即可获得。但是,Google Play上架应用时会检测并限制该权限的使用。同理,在queries中声明“宽泛的intent”也将受到Google Play的检测和限制。其中第三种方式简单粗暴,但是在我自己去尝试的过程当中,发现根本不被允许,会提示以下报错,直接不允许这样干,可能也是怕滥用权限把。
    所以归根结底解决方式就是在Manifest.xml中加入queries标签来声明要交互的应用程序。
Failed to find provider info for xxx,Unknown URL content 的问题归因和解决办法