我们正在尝试发布一款免费广告的付费广告版本,该应用目前免费发布广告。我们将所有包名重构为com.mycompanyname.appname.pro
,市场上的免费包基本上没有.pro。我们也进入了内容提供商,并将权限更改为与包名相同。所以“免费版”有
AUTHORITY = "com.mycompanyname.appname"
并且“无广告付费版本
AUTHORITY = "com.mycompanyname.appname.pro"
但我们仍无法在同一台设备上安装免费版和“专业版”。无论它的价值如何,提供商的类名在两个应用程序中都是相同的。
我们无法直接从apk安装,如果我们尝试从Android市场下载,则会收到“重复的提供商权限”错误消息。
我们缺少什么?还有另一个地方我们需要寻找问题,还是我们在这里遇到了根本性的错误?
答案 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
在您的免费项目和付费项目中,在包中创建一个相同的文件,该文件可以是任何内容,但必须相同。
示例:
使用com.android.app.data在您的免费版本中创建一个新包
创建一个名为Authority.java的文件,并在(Authority.java)中放置:
public class Authority {
`public static final String CONTENT_AUTHORITY = "YOUR PROVIDER";`
}
对付费版本重复此操作,请记住保持包名称和类名相同。
现在,在您的合同文件中,在您的库中使用以下内容:
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)