首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android重复提供商权限问题

Android重复提供商权限问题
EN

Stack Overflow用户
提问于 2011-06-21 11:48:45
回答 4查看 26.1K关注 0票数 7

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

代码语言:javascript
复制
AUTHORITY = "com.mycompanyname.appname" 

而“无广告付费版”

代码语言:javascript
复制
AUTHORITY = "com.mycompanyname.appname.pro" 

但是我们仍然无法在同一设备上同时安装免费版和"pro“版。无论如何,在这两个应用程序中,提供程序的类名是相同的。

我们不能直接从apk上安装,如果我们尝试从Android market下载,我们会得到一个"duplicate provider authority“错误信息。

我们遗漏了什么?有没有其他地方我们需要寻找问题,或者我们在这里有什么根本的错误吗?

EN

回答 4

Stack Overflow用户

发布于 2012-10-19 04:44:39

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

代码语言:javascript
复制
public AbstractContentProvider() {
    sURIMatcher.addURI(getAuthority(), BASE_PATH, ITEMS);
    sURIMatcher.addURI(getAuthority(), BASE_PATH + "/#", ITEM_ID);
}

protected abstract String getAuthority();

然后在每个子类中,我有:

代码语言:javascript
复制
private static final String AUTHORITY = "my.package.app1.ContentProvider";

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

在AndroidManifest中,我将这些注册为:

代码语言:javascript
复制
    <provider
          android:name="my.package.app1.ContentProvider"
          android:authorities="my.package.app1.ContentProvider">
    </provider>

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

代码语言:javascript
复制
Uri.parse(getString(R.string.contentProviderUri))

在每个应用程序中,正确的ContentProvider都会被使用,没有任何冲突。所以基本上是使用配置机制来进行依赖注入。

票数 2
EN

Stack Overflow用户

发布于 2014-01-11 19:22:51

假设你的库包是com.android.app.library免费包是com.android.app.free付费包是com.android.app.paid

在你的免费项目和付费项目中,在一个包中创建一个相同的文件,这个包可以是任何东西,但必须是相同的。

示例:

使用com.android.app.data

  • Create在您的免费版本中创建一个新的包,文件名为
  1. ( Authority.java ) put:

public class Authority {

public static final String CONTENT\_AUTHORITY = "YOUR PROVIDER";

对于付费版本,请记住保持包名和类名相同。

现在,在您的契约文件中,在库中使用以下内容:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-02-10 13:33:30

谷歌默认会在你的应用中添加应用测量提供商,因此在build.gradle文件中,你需要在安卓标签exaple defaultConfig下定义applicationID { applicationId "com.example.my.app" minSdkVersion 15 targetSdkVersion 19 versionCode 1 versionName "1.0“}

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6420130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档