一个android库项目包含一些提供程序,其权限在合同类中定义如下:
public static final String CONTENT_AUTHORITY = "my.com.library.providers.tester";
private static final Uri BASE_CONTENT_URI = Uri.parse("content://" + CONTENT_AUTHORITY);
Run Code Online (Sandbox Code Playgroud)
现在有很多应用程序项目使用这个库项目.我目前面临的问题是,对于每个应用程序项目,我需要在库项目中为每个应用程序设置一个单独的分支,以便拥有唯一的内容权限.这会产生一些版本管理问题(例如将功能/错误修复从一个分支传播到每个其他分支等).相反,我想将定义内容权限的责任委托给app项目.有没有办法实现这个目标?
java android authority android-contentprovider android-library
可能重复:
Content Provider INSTALL_FAILED_CONFLICTING_PROVIDER(将内容提供程序安装为单独的apk)
问题 :
我们有一个使用a的库ContentProvider.因此它有相关的方法来使用和创建ContentProvider.当我们ContentProvider为一个权威机构宣布建立应用程序A时,一切运作良好.
ContentProvider在此之后无法安装第二个打算使用相同的应用程序,而不会抛出INSTALL_FAILED_CONFLICTING_PROVIDER错误.唯一的选择是ContentProvider使用新的权限声明,这不是我们想要的(因为要求是使用ContentProvider已经为该权限定义的任何现有权限).
因此可以:
1)以ContentProvider编程方式注册(即如果ContentResolver.acquireContentProviderClient返回null,是否可以ContentProvider在应用程序中注册?)
要么
2)ContentProvider只有在所需的权限尚不存在时才在清单中指定需要注册的内容?
我正在使用ContentProvider开发应用程序.它在清单中声明:
<provider android:name="foor.bar.FooBarProvider"
android:authorities="foo.bar.FoorBarProvider" />
Run Code Online (Sandbox Code Playgroud)
一切正常,我可以访问提供商.问题是我想创建我的应用程序的演示版本,我希望它共享相同的内容提供程序,因此当用户安装完整版本时,数据保持同步.此外,应该可以只安装完整版或演示版.因此,我必须在两者中都包含我的内容提供商.
现在,当我尝试安装这两个应用程序时,我收到一条INSTALL_FAILED_CONFLICTING_PROVIDER错误消息,显然是因为AndroidManifest都声明了相同的内容提供程序.
有没有办法在Manifest中说明只有在内容提供程序尚不存在的情况下才应该使用它?还是另一种解决方法?
一个解决方案是完整版本将数据从演示内容提供商迁移到完整版内容提供商,但我宁愿避免这种情况.
它工作完美。我可以查看 pdf,但现在由于以下错误,我无法在手机中安装其他版本:
Installation did not succeed. The application could not be installed: INSTALL_FAILED_CONFLICTING_PROVIDER Installation failed due to: 'null' Retry
参考代码:
应用级build.gradle文件
defaultConfig {
applicationId "com.abc.xyz"
minSdkVersion 21
targetSdkVersion 29
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"}
flavorDimensions "version"
productFlavors {
appdev {
dimension "version"
applicationIdSuffix ".dev"
versionCode buildVersionCodeDev()
versionName version_dev
}
appqa {
dimension "version"
applicationIdSuffix ".qa"
versionCode buildVersionCodeQA()
versionName version_qa
}
apppro {
dimension "version"
applicationIdSuffix ".pro"
versionCode buildVersionCodePro()
versionName version_pro
}
}
Run Code Online (Sandbox Code Playgroud)
AndroidManifest.xml
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.freshdesk.helpdesk.provider"
android:exported="false"
android:grantUriPermissions="true"
tools:replace="android:authorities">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" /> …Run Code Online (Sandbox Code Playgroud) android android-install-apk build.gradle android-build-flavors android-gradle-3.0