我正在试验 Android SDK 中的 NotesList 示例程序。我对程序做了一些细微的改动,但是当我安装我编辑的版本时,当我尝试在设备上安装原始笔记程序时,我一直在控制台中收到消息 INSTALL_FAILED_CONFLICTING_PROVIDER 。我需要在 Provider 中进行哪些更改才能使其成为唯一的数据库?如果我卸载原始笔记程序然后安装我编辑的版本,它工作正常。
29 回答
中列出的权限android:authorities
必须是唯一的。引用此属性的文档:
为避免冲突,权限名称应使用 Java 风格的命名约定(例如 com.example.provider.cartoonprovider)。通常,它是实现提供程序的 ContentProvider 子类的名称
如果您有不同的风格并且希望避免权限名称冲突,您可以添加一个applicationIdSuffix
构建类型并applicationId
在清单中使用结果,如下所示:
<...
android:authorities="${applicationId}.contentprovider"/>
当您安装了旧版本的应用并对(支持)库或清单文件进行了更改时,也会发生这种情况。从您的设备中删除旧的应用程序 ( Settings --> Application --> <your application> --> Uninstall
) 将解决问题。
如果您在库项目中使用 Google Maps + Google Play Services(尤其是如果您最近从 Eclipse 迁移到 Android Studio),当您尝试运行使用您的库的应用程序时可能会遇到此错误,而另一个应用程序使用您的设备上已经安装了相同的库。
修复:
确保 defaultConfig.applicationId 在build.gradle
文件的 android 部分中为使用您的库的每个项目定义
android {
defaultConfig.applicationId = "com.company.appname"
}
我建议使用特定应用程序的包名称。通过此修复,提供程序名称将不再冲突,您的应用程序将按预期运行。
症状
1.) 从 Play 商店安装您的应用时,您的用户会看到可怕的“-505”安装错误。
2.) 当您尝试通过 Android Studio [INSTALL_FAILED_CONFLICTING_PROVIDER] 安装使用您的库的第二个应用程序时,您将看到此错误消息:
在您的控制台中,您将看到如下消息:
Package couldn't be installed in /data/app/com.company.appname-1
com.android.server.pm.PackageManagerException:
Can't install because provider name
com.google.android.gms.measurement.google_measurement_service
(in package com.company.appname) is already used by
com.company.otherInstalledAppName
修复方法是确保在build.gradle
文件的 android 部分中为使用您的库的每个项目定义 defaultConfig.applicationId
android {
defaultConfig.applicationId = "com.company.appname"
}
更多阅读可以在原始错误报告中找到:问题 784:使用相同权限提供者名称的多个应用程序
如果您使用的是 Facebook SDK,那么问题可能在于您为 Facebook 提供商提供的“权限”值。
代替 -
<provider
android:name="com.facebook.FacebookContentProvider"
android:authorities="com.facebook.FacebookContentProvider"
android:exported="true" />
与->
<provider
android:name="com.facebook.FacebookContentProvider"
android:authorities="com.facebook.FacebookContentProvider[YOUR_APP_ID]"
android:exported="true" />
您可能defaultConfig.ApplicationId
还需要按照其他答案中的建议更改。
重命名包后可能会出现同样的错误。android:authorities
从 AndroidManifest.xml检查 string.xml 中的值。
<provider
android:authorities="@string/content_authority"
android:name=".data.Provider"
... />
在 string.xml 中,值应该与清单中声明的包名称相同。
<string name="content_authority">com.whatever.android.sunshine.app</string>
我尝试了很多解决方案,但找不到解决方案......但是这个链接帮助了我......我想提供有关问题的详细信息......
我正在运行 Instrumented 测试用例,因此我的应用程序在启动器中不可见......但它已安装并因此使用Same Content Provider。所以,我应该以某种方式卸载它。所以Settings -> Application Manager -> All Downloaded Apps -> uninstall all apps from your current development package
现在,尝试运行...这将工作...
您在清单中声明的权限 + 提供者名称可能
基本上这发生在我身上,当我尝试更改应用程序的包名称时。
因此,在模拟器中,之前安装了相同的应用程序。当我在更改包名称后尝试安装应用程序时,它说权限已被设备中的旧应用程序使用。
只需卸载应用程序后,它就解决了我的问题。
此外,授权名称应始终为 : your.package.name.UNIQUENAME
;
例子 :
<provider
android:name="com.aviary.android.feather.cds.AviaryCdsProvider"
android:authorities="your.package.name.AviaryCdsProvider"
/>
当我在多个应用程序中使用一个库时,我遇到了类似的问题。只需使用下面这个确切的提供程序声明更新您的 AndroidManifest.xml 是必要的。
<manifest ...>
<application ...>
<provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.here.this.library.provider" android:exported="false" android:grantUriPermissions="true" tools:replace="android:authorities">
</provider>
</application>
</manifest>
我认为通过将其图标拖动到“卸载”来卸载该应用程序可以解决问题,但事实并非如此。
这是解决问题的方法:
- 前往设置
- 选择应用程序
- 找到您的应用程序(是的,我很惊讶仍然在这里找到它!)并按下它
- 在右上角,按 3 个点
- 选择“为所有用户卸载”
再试一次,它现在应该可以工作了。
如果您在应用程序内使用 Facebook,请检查AndroidManifest
文件内的提供程序标签并检查您project Id
是否正确android:authorities
<provider android:name="com.facebook.FacebookContentProvider" android:authorities="com.facebook.app.FacebookContentProvider112623702612345" android:exported="true" />
遇到了这个问题。
通过以下方式解决它:
1 - 打开 AndroidManifest.xml
2 - ctrl+f 找到“提供者”
3 - 找到提供者并在那里更新您的根目录名称。
运行项目。希望问题将得到解决!
说明显而易见的,但也要确保你没有默默地搞乱对applicationId
in 的引用android:authorities
。
就我而言,我打错了字并省略了该死的美元符号:
android:authorities="{applicationId}.myprovider"
代替 :
android:authorities="${applicationId}.myprovider"
这不会导致任何直接错误(因为它是有效的授权名称)。但是几天后,当我尝试安装应用程序的不同变体时,很难理解出了什么问题,因为错误消息并没有提供有关内容提供者出了什么问题的太多信息。
解决此问题的另一种方法是比较您的合并清单,寻找相同的权限。
如果您使用的是模拟器,您可以尝试以下操作。以下对我有用。转到工具--> AVD 管理器-->(选择您的模拟器)--> 擦除数据。错误消失了。
使用带有命令的 adb 安装./adb install -r abc.apk
将解决问题(即使设备具有更高的应用程序版本也会覆盖)
我有这个问题:
Installation did not succeed.
The application could not be installed: INSTALL_FAILED_CONFLICTING_PROVIDER
但它不是来自清单提供者,我的应用程序中的以下库与其他应用程序发生冲突,其他应用程序无法安装:
implementation 'com.iceteck.silicompressorr:silicompressor:2.2.1'
在使用以下 AndroidmManifest.xml 实现库时,我遇到了这个错误
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="library.path.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
当我将以下代码放入项目 AndroidManifest.xml (app/src/main) 时,我解决了这个问题:
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true"
tools:replace="android:authorities">
</provider>
如果您使用 Xamarin 并收到此错误(可能是因为 Firebase.Crashlytics):
INSTALL_FAILED_CONFLICTING_PROVIDER
Package couldn't be installed in [...]
Can't install because provider name dollar_openBracket_applicationId_closeBracket (in package [...]]) is already used by [...]
如此处所述,您需要更新 Xamarin.Build.Download:
- 将 Xamarin.Build.Download Nuget 包更新为0.4.12-preview3
- 在 Mac 上,您可能需要在Add Packages窗口中选中Show pre-release packages
- 关闭 Visual Studio
- 删除 NuGet 包的所有缓存位置:
- 在 Windows 上,打开 Visual Studio 但不是解决方案:
- 工具 -> 选项 -> Nuget 包管理器 -> 常规 -> 清除所有 Nuget 缓存
- 在 Mac 上,擦除以下文件夹:
~/.local/share/NuGet
~/.nuget/packages
packages
解决方案中的文件夹
- 在 Windows 上,打开 Visual Studio 但不是解决方案:
- 删除解决方案中的 bin/obj 文件夹
- 加载解决方案
- 恢复解决方案的 Nuget 包(应该自动运行)
- 重建
您可以从运行该应用程序的设备上卸载程序包名称“com.example”,然后再运行该应用程序。这对我有用
它帮助了我:转到 AndroidManifest 并粘贴或替换为此代码
<provider
android:authorities="${applicationId}.here.this.library.provider"
android:name="androidx.core.content.FileProvider"
android:exported="false"
android:grantUriPermissions="true"
tools:replace="android:authorities" >
</provider>
是的!我和你有同样的问题。正如你所说,你使用“变体”。保持“权威”的唯一性,你可以这样写
android:authorities="${applicationId}.provider"
如果您在一个应用程序中使用了多个库,则与上述相同。
在我的 android 设备中,我安装了同一个应用程序的不同风格。这给了我错误INSTALL FAILED CONFLICTING PROVIDER。所以我卸载了同一个应用程序的所有风格。并尝试过
adb install -r /Users/demo-debug-92acfc5.apk
它解决了我的问题。
need to use android:name="androidx.core.content.contentprovider
or android:name="androidx.core.content.provider insteadof
android:name="androidx.core.content.fileprovider
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.contentprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" />
</provider>
解决方案 1
在物理设备而不是模拟器上运行应用程序。我遇到了这个问题,我的应用没有定义内容提供者。
解决方案 2
在另一个例子中,我安装了一个与相同的 applicationId 匹配的检测测试应用程序。
为了解决这个问题,我必须运行- uA 是task ./gradlew uA
的缩写。uninstallAll
您也可以使用 Gradle 面板并选择导航到app\install\uninstallAll任务
如果您使用模拟器,则可以清除数据
如果您正在使用提供商检查并通过以下方法进行检查
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="androidx.multidex.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_path" />
</provider>
或使用它
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.contentprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_path" />
</provider>
如果应用程序已经在您的移动卸载中退出,然后检查
如果您使用 Audience Network Content Provider,您需要在您的应用 AndroidManifest.xml 中添加此代码
<provider
android:name="com.facebook.FacebookContentProvider"
android:authorities="com.facebook.app.FacebookContentProvider165632208074623"
android:exported="true" />
您的 Facebook 应用程序 ID ---> 165632208074623
如果您只需要使用 facebook 登录您的应用程序,这里有一个提示:(此修复在 cordova 项目中有效)必须完成第 1 步和第 2 步才能解决问题。
1.在该文件中找到文件:platform/android/android.json:删除此代码:
,{"xml": "<provider android:authorities=\"com.facebook.app.FacebookContentProvider<FACEBOOK_APP_ID>\" android:exported=\"true\" android:name=\"com.facebook.FacebookContentProvider\" />","count": 1
}
然后找到文件:platforms/android/app/src/main/androidManifest.xml
删除此代码:
<provider android:authorities="com.facebook.app.FacebookContentProvider<FACEBOOK_APP_ID>" android:exported="true" android:name="com.facebook.FacebookContentProvider" />
现在应用程序可以正常运行。如果这个答案与 OP 无关,我很抱歉,但它可能会帮助许多其他有这个问题的人。我在其他任何地方都找不到这个确切的答案。
检查<provider标签下的android:authorities属性
检查你的包名是否正确