【问题标题】:Failed to find provider info for 'ContentProvider'找不到“ContentProvider”的提供商信息
【发布时间】:2011-09-18 17:23:19
【问题描述】:

我有一个我无法弄清楚的问题。我正在使用 Eclipse 创建自己的内容提供程序,但不断收到以下错误:

[..] 错误/ActivityThread(1051): 未能找到提供者信息 my.package.provider.countrycontentprovider

在此处找到代码:http://codepad.org/Rx00HjHd

主要部分:

public class CountryContentProvider extends ContentProvider {

    public static final String PROVIDER = 
         "my.package.provider.countrycontentprovider";
    public static final Uri CONTENT_URI = 
         Uri.parse("content://" + PROVIDER + "/country");
    // ...
    @Override
    public boolean onCreate() { return true; }
    // ...
}


// from my activity
ContentResolver resolver = getContentResolver();
Cursor c = resolver.query(CountryContentProvider.CONTENT_URI, 
                                  null, null, null, null);  

// AndroidManifest.xml
<provider
    android:name="my.package.provider.CountryContentProvider"
    android:authorities="my.package.provider.countrycontentprovider" />

我已将提供程序添加到清单并从 onCreate 函数返回 true。我在我的活动中使用CountryContentProvider.CONTENT_URI 从我的提供者那里获取内容,但我只是不断收到该错误消息。我已经删除并添加了 3 次代码(以防 Eclipse 崩溃)但无济于事。
我肯定错过了什么。有人能指出我正确的方向吗?

【问题讨论】:

    标签: android android-contentprovider


    【解决方案1】:

    当我将 移出 ... 标记时,我能够重现您的问题。 Eclipse 没有说任何错误或警告。

    幸运的是,从 ADT 20 开始,Android Lint 检测到了这个问题。

    【讨论】:

    • 所以我的意思是&lt;provider&gt;标签应该放在&lt;application&gt;标签里面。
    • 另外,请注意不要像我一开始那样把它放在 标记中。
    【解决方案2】:

    只有在清单文件中的 Authorities 标记中指定完整路径后它才对我有用(请参阅 SDK 中的 SearchableDictionary 示例代码)。

    <provider android:name=".DictionaryProvider"
           android:authorities="com.example.android.searchabledict.DictionaryProvider">
    

    【讨论】:

      【解决方案3】:

      在清单中的提供程序标记中将导出的属性设置为 true 对我有用:

      android:exported="true"
      

      根据文档 (http://developer.android.com/guide/topics/manifest/provider-element.html#exported),仅当提供程序可用于其他应用程序时才需要导出。但这是唯一对我有用的解决方案。

      【讨论】:

        【解决方案4】:

        XML 文件中的 android:authorities= 是位于您可能构建的合同类中的内容授权。将内容授权添加到方案中以生成基本内容 URI。简单的英语,你用来让你的应用程序没有大写的反向域 com.domain.sub.appName。

        android:name 是您的提供者命名的文件夹加类,不要忘记点 .folder.ProviderClassContentAuthorityIsIn。

        希望这会有所帮助:)

        【讨论】:

          【解决方案5】:

          在具有 contentresolver 的 B-app 中,将其添加到 AndroidManifest.xml 中,在 application-tag 之外

          <queries>
                  <provider android:authorities="com.authoritiesname.in.contentprovider.app" />
              </queries>

          【讨论】:

            【解决方案6】:

            你有一个大写字母,另一行是一个小写字母。

            android:name="my.package.provider.-C-ountryContentProvider" android:authorities="my.package.provider.-c-ountrycontentprovider"

            它必须在任何地方都相同。

            public static final String PROVIDER = 
                 "my.package.provider.countrycontentprovider";
            

            【讨论】:

            • 权限需要匹配(即,清单中与类文件中的相同 - my.package.provider.countrycontentprovider)。并且类名需要匹配 - my.package.provider.CountryContentProvider。所以我认为这不是问题。
            【解决方案7】:

            在 Android 清单中注册您的提供商

            <provider
                android:authorities="your_content_authority"
                android:name="yourProviderClass"/>
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-09-22
              • 1970-01-01
              • 1970-01-01
              • 2016-02-26
              • 1970-01-01
              • 1970-01-01
              • 2013-03-27
              • 1970-01-01
              相关资源
              最近更新 更多