Android重复提供商权限问题

时间:2011-06-21 03:48:45

标签: android google-play android-contentprovider

我们正在尝试发布一款免费广告的付费广告版本,该应用目前免费发布广告。我们将所有包名重构为com.mycompanyname.appname.pro,市场上的免费包基本上没有.pro。我们也进入了内容提供商,并将权限更改为与包名相同。所以“免费版”有

AUTHORITY = "com.mycompanyname.appname" 

并且“无广告付费版本

AUTHORITY = "com.mycompanyname.appname.pro" 

但我们仍无法在同一台设备上安装免费版和“专业版”。无论它的价值如何,提供商的类名在两个应用程序中都是相同的。

我们无法直接从apk安装,如果我们尝试从Android市场下载,则会收到“重复的提供商权限”错误消息。

我们缺少什么?还有另一个地方我们需要寻找问题,还是我们在这里遇到了根本性的错误?

4 个答案:

答案 0 :(得分:2)

基本上我所做的是,为每个ContentProviders创建一个抽象基类,并从我想要创建的每个应用程序继承它,覆盖权限路径。所以在我的AbstractContentProvider中我有:

public AbstractContentProvider() {
    sURIMatcher.addURI(getAuthority(), BASE_PATH, ITEMS);
    sURIMatcher.addURI(getAuthority(), BASE_PATH + "/#", ITEM_ID);
}

protected abstract String getAuthority();

然后在每个子类中我有:

private static final String AUTHORITY = "my.package.app1.ContentProvider";

@Override
protected String getAuthority() {
    return AUTHORITY;
}

在AndroidManifest中我用以下内容注册:

    <provider
          android:name="my.package.app1.ContentProvider"
          android:authorities="my.package.app1.ContentProvider">
    </provider>

现在的诀窍是,我想在公共(库)代码中访问这些内容提供程序,这些代码不了解特定于应用程序的类。为此,我在strings.xml中定义了一个String,我为每个应用程序覆盖。然后我可以使用:

Uri.parse(getString(R.string.contentProviderUri))

并且在每个应用程序中使用正确的ContentProvider而没有任何冲突。所以基本上使用配置机制进行依赖注入。

答案 1 :(得分:2)

让我们说 库包是com.android.app.library 免费套餐是com.android.app.free 付费套餐为com.android.app.paid

在您的免费项目和付费项目中,在包中创建一个相同的文件,该文件可以是任何内容,但必须相同。

示例:

  1. 使用com.android.app.data在您的免费版本中创建一个新包

  2. 创建一个名为Authority.java的文件,并在(Authority.java)中放置:

    public class Authority {

    `public static final String CONTENT_AUTHORITY = "YOUR PROVIDER";`
    

    }

  3. 对付费版本重复此操作,请记住保持包名称和类名相同。

  4. 现在,在您的合同文件中,在您的库中使用以下内容:

    public static String AUTHORITY = initAuthority();
    
        private static String initAuthority() {
            String authority = "something.went.wrong.if.this.is.used";
    
            try {
    
                ClassLoader loader = Contract.class.getClassLoader();
    
                Class<?> clz = loader.loadClass("com.android.app.data.Authority");
                Field declaredField = clz.getDeclaredField("CONTENT_AUTHORITY");
    
                authority = declaredField.get(null).toString();
            } catch (ClassNotFoundException e) {} 
            catch (NoSuchFieldException e) {} 
            catch (IllegalArgumentException e) {
            } catch (IllegalAccessException e) {
            }
    
            return authority;
        }
    
        public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY);
    

    现在你应该能够使用两个权限。

    信用:Ian Warick Android - Having Provider authority in the app project

答案 2 :(得分:2)

谷歌默认在您的APP中添加应用程序度量提供程序,因此在build.gradle文件中您需要在android标签exaple下定义applicationID defaultConfig {          pplicationId“com.example.my.app”         minSdkVersion 15         targetSdkVersion 19         versionCode 1         versionName“1.0”     }

答案 3 :(得分:0)

我遇到了同样的问题,并收到一条错误消息,抱怨提供商名称已经注册。我认为诀窍可能是使用不同的权限以及不同的名称 - 因此,在我的情况下,在免费版和专业版中扩展我的基础提供程序。这将解决你的问题,如果你仍然有它(注意这是一个旧帖子,但没有答案,所以我决定发布我的方式无论如何)。

我很好奇是否有其他人遇到同样的事情,果然它似乎是Android平台中的一个错误。请参阅问题详情here或类似的SO帖子here