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

本文针对《安卓第一行代码》中ContentProvider无法找到providerUri的问题进行解析,包括问题产生的原因如未正确配置、拼写错误及权限问题,并提供了解决方案,通过在Manifest文件中加入queries标签声明交互的应用程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.问题背景

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

2.问题归因

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

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

后续思考

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

<manifest>
          ......
          <queries>
                    <package android:name=”com.another.app”/>
          </queries>
          ......
</manifest>

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

<manifest>
          ......
            <queries>
                      <intent>
                            <action android:name="android.intent.action.SEND" />
                            <data android:type="image/jpeg" />
                     </intent>
            </queries>
......
</manifest>

● 声明要交互所有的app

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

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值