【问题标题】:INSTALL_FAILED_CONFLICTING_PROVIDER in AndroidAndroid 中的 INSTALL_FAILED_CONFLICTING_PROVIDER
【发布时间】:2014-01-21 23:31:35
【问题描述】:

我正在为一个名为 MyTracks 的应用使用来自 Google 的开源代码。

我在手机上安装原始应用时收到此错误。

INSTALL_FAILED_CONFLICTING_PROVIDER

我知道这是因为清单中的android:authorities

这是清单的一部分:

<provider
android:name="com.google.android.apps.mytracks.content.MyTracksProvider"
android:authorities="com.google.android.maps.mytracks"
android:exported="true"
android:readPermission="com.google.android.apps.mytracks.READ_TRACK_DATA"
android:writePermission="com.google.android.apps.mytracks.WRITE_TRACK_DATA" />
<!-- Search suggestion provider -->
<provider
android:name="com.google.android.apps.mytracks.content.SearchEngineProvider"
android:authorities="com.google.android.maps.mytracks.search"
android:exported="false" />

所以,我的问题是:我想知道这种方法是否可以解决问题,因为我害怕更改所有包名称,然后整个应用程序都坏了。

  1. android :authorities 值是包名称。 android:name 是该提供者的类的名称。 我说的对吗?

如果我将包名称更改为不同于 com.google etx 的另一个名称,并重命名该包的所有引用/导入,问题是否应该消失?

【问题讨论】:

    标签: java android manifest android-contentprovider


    【解决方案1】:

    android :authorities 值是包名。

    在这种情况下,它恰好是包名。它必须是独一无二的。

    android:name 是该提供者的类的名称

    正确。

    如果我将包名称更改为不同于 com.google etx 的另一个名称,并重命名该包的所有引用/导入,问题是否应该消失?

    包名与它无关。不过,您可能还需要更改它,以便您的应用能够与常规的、未修改的应用一起安装。

    您需要为android:authorities 提供唯一值,并且您的应用中使用此ContentProvider 的代码需要使用适当的Uri (content://whatever.you.change.the.authority.to/...)。

    【讨论】:

    • 我已经为每种口味更改了 applicationId。但我得到了上面提到的错误。
    • 我可能在同一设备上运行具有不同变体的同一应用程序。哪个作为同一设备中的不同应用程序做出反应?
    • @iDroidExplorer:问题是关于内容提供者权限的。构建变体在这里并不重要——权限仍然必须是唯一的。不过,您可以在清单合并过程中使用占位符使权限字符串基于构建变体的applicationId。例如,使用 android:authorities="${applicationId}.provider" to have the authority string be the applicationId` 并附加 .provider
    【解决方案2】:

    如果您在图书馆项目中使用 Google 地图 + Google Play 服务,当您尝试运行使用您的图书馆的应用时,您可能会遇到此错误,而您的设备上已经安装了使用相同图书馆的其他应用.

    修复: 确保 defaultConfig.applicationId 在 build.gradle 文件的 android 部分中为使用您的库的每个项目定义

    android {
        defaultConfig.applicationId = "com.company.appname"
    }
    

    我建议使用特定应用程序的包名称。通过此修复,提供程序名称将不再冲突,您的应用将按预期运行。

    症状

    1.) 您的用户在从 Play 商店安装您的应用时会看到可怕的“-505”安装错误。

    2.) 当您尝试通过 Android Studio 安装使用您的库的第二个应用时,您将看到此错误消息:

    在您的控制台中,您将看到如下消息:

    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"
    }
    

    可以在原始错误报告中找到更多阅读内容:Issue 784: Multiple apps using same authority provider name

    【讨论】:

      【解决方案3】:

      只需从您的设备上卸载 helloFacebooksample 应用程序

      【讨论】:

        【解决方案4】:

        如果您使用前 facebook-sdk 然后对于每个应用程序,您需要在清单中唯一的这一行

        <provider android:authorities="com.facebook.app.FacebookContentProviderxxxxxxxxxx"
                    android:name="com.facebook.FacebookContentProvider"
                    android:exported="true"/>
        

        xxxxxxxxxx - 每个应用程序都应该是唯一的,对于 facebook-sdk,它是您的 facebook_id 号码

        【讨论】:

        • 答案补充:如果您正在使用 facebook 集成测试 2 个不同版本的应用程序,那么您可以登录 facebook 开发人员仪表板,转到您的应用程序,在左上角单击您的应用程序的名称,在菜单中单击 + 创建测试应用程序。这将创建一个具有另一个应用 ID 的测试应用。将它用于您的应用的测试版本。
        【解决方案5】:

        我在应用程序清单中更改包名称时遇到了同样的错误。当您尝试再次安装应用程序(使用新的包名称)时,这会产生冲突。解决方案是删除旧版本的应用(使用旧包名称),然后您就可以安装新版本。

        【讨论】:

        • 如果有人想同时安装这两个版本怎么办。例如应用的测试版?
        • 嗨沙吉尔。我从未尝试过,但我想你会遇到同样的问题 - 除非你知道更多?
        • 实际上问题出在清单中声明的​​提供者的权限上,更改包后我不得不手动更改权限,现在它正在工作。
        【解决方案6】:

        gradle 也需要包含这个

        defaultConfig {
          applicationId "com.example.app"
        }
        

        我完全忽略了它

        【讨论】:

          【解决方案7】:

          CommonsWare 说得对,不过,还有更多细节可能会有所帮助。

          对我来说,解决方案有两个关键部分。 首先,我将 $(applicationId) 添加到 Manifest 提供程序条目:

                  <provider
                      tools:replace="android:authorities"
                      android:name="android.support.v4.content.FileProvider"
                      android:authorities="${applicationId}.files"
                      android:exported="false"
                      android:grantUriPermissions="true">
                      <meta-data
                          android:name="android.support.FILE_PROVIDER_PATHS"
                          android:resource="@xml/fileprovider" />
                  </provider>
          

          其次,当您切换 Build Varients 时,对我来说这是在“调试”和“发布”之间,您还需要将项目与 Gradle 文件同步。仅仅清理和重建项目是不够的。

          在 Android Studio 中,AndroidManifest.xml 页面底部有两个选项卡。您用于编辑的“文本”选项卡和“合并清单”选项卡显示了构建后生成的清单,对我来说,我可以看到它正在将 applicationId 正确地注入提供程序的 android:authorities 部分。

          【讨论】:

            【解决方案8】:

            只需从您尝试运行的设备上卸载应用程序,然后再次尝试重新安装应用程序。现有应用程序与新应用程序冲突。

            【讨论】:

              【解决方案9】:

              您可能会编译相同的库或包含库。例如:

              compile 'com.google.android.gms:play-services:8.1.0'
              compile 'com.google.android.gms:play-services-ads:8.1.0'
              compile 'com.google.android.gms:play-services-identity:8.1.0'
              compile 'com.google.android.gms:play-services-gcm:8.1.0'
              

              以上代码,google play services(第一行)包括所有其他服务。

              【讨论】:

                【解决方案10】:

                可能是您的手机内存已满,请检查一下

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-10-27
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多