Android中的INSTALL_FAILED_CONFLICTING_PROVIDER

时间:2014-01-21 23:31:36

标签: java android manifest android-contentprovider

我正在使用Google的open-srouce代码来创建名为MyTracks的应用。

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

INSTALL_FAILED_CONFLICTING_PROVIDER

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

这是Manifest的一部分:

<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是该提供者的类的名称。 我是对的吗?
  2. 如果我将包名更改为另一个与com.google etx不同的名称,并重命名该包的所有引用/导入,问题是否会消失?

10 个答案:

答案 0 :(得分:29)

  

android:authorities值是包名。

在这种情况下,发生作为包名称。它必须是独一无二的。

  

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

正确。

  

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

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

您需要拥有android:authorities的唯一值,并且您的应用中使用此ContentProvider的代码需要使用适当的Uricontent://whatever.you.change.the.authority.to/...)。< / p>

答案 1 :(得分:6)

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

<强>修正: 确保使用您的库为每个项目的build.gradle文件的android部分定义defaultConfig.applicationId

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

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

<强>症状

1。)您的用户正在看到可怕的&#34; -505&#34;从Play商店安装应用时出现安装错误。

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

enter image description here

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

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

答案 2 :(得分:5)

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

答案 3 :(得分:4)

如果您使用ex facebook-sdk 然后对于每个应用程序,您需要在清单

中使用此行
<provider android:authorities="com.facebook.app.FacebookContentProviderxxxxxxxxxx"
            android:name="com.facebook.FacebookContentProvider"
            android:exported="true"/>

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

答案 4 :(得分:2)

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

答案 5 :(得分:1)

gradle还需要包含此

defaultConfig {
  applicationId "com.example.app"
}

我把它完全抛弃了

答案 6 :(得分:0)

CommonWare正确,但是,更多细节可能会有所帮助。

对我来说,解决方案有两个关键部分。 首先,我在清单提供者条目中添加了$(applicationId):

        <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时,对于我来说,这是在'debug'和'release'之间的,您还需要将Project与Gradle文件同步。仅清理和重建项目还不够。

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

答案 7 :(得分:0)

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

答案 8 :(得分:-1)

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

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服务(第一行)包含所有其他服务。

答案 9 :(得分:-1)

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