Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Android中安装\u失败\u冲突\u提供程序_Java_Android_Manifest_Android Contentprovider - Fatal编程技术网

Java 在Android中安装\u失败\u冲突\u提供程序

Java 在Android中安装\u失败\u冲突\u提供程序,java,android,manifest,android-contentprovider,Java,Android,Manifest,Android Contentprovider,我正在使用谷歌的开源软件MyTracks 我在手机上安装原始应用程序时遇到此错误 INSTALL_FAILED_CONFLICTING_PROVIDER 我知道这是因为清单中的android:authorities 以下是清单的一部分: <provider android:name="com.google.android.apps.mytracks.content.MyTracksProvider" android:authorities="com.google.android.maps

我正在使用谷歌的开源软件MyTracks

我在手机上安装原始应用程序时遇到此错误

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

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

  • android:authorities
    值是包名。
    android:name
    是该提供者的类的名称。 我说得对吗
  • 如果我将包名更改为与com.googleetx不同的另一个包名,并重命名该包的所有引用/导入,问题是否应该消失

    android:authorities值是包名

    在本例中,它恰好是包名。它必须是独一无二的

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

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

    包名与此无关。不过,你可能也需要改变这一点,以便你的应用程序能够与常规、未修改的应用程序一起安装


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

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

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

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

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

    如果您在库项目中使用google Maps+google play services,则当您尝试运行使用库的应用程序时,可能会遇到此错误,而您的设备上已经安装了使用相同库的其他应用程序

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

    android {
        defaultConfig.applicationId = "com.company.appname"
    }
    
    我建议使用特定应用程序的软件包名称。使用此修复程序,提供商名称将不再冲突,您的应用程序将按预期运行

    症状

    1.)从Play Store安装应用程序时,用户会看到可怕的“-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"
    }
    

    更多信息可以在原始bug报告中找到:

    gradle也需要包含这些信息

    defaultConfig {
      applicationId "com.example.app"
    }
    

    如果您使用ex FacebookSDK,那么我完全忽略了它 然后,对于每个应用程序,您需要在清单中显示唯一的这一行

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

    xxxxxxxxxx-对于每个应用程序都应该是唯一的,对于facebook sdk,它是您的facebook_id号,可能是您的手机内存已满,请检查它,但是,有更多的细节可能会有所帮助

    对我来说,解决方案有两个关键部分。 首先,我将$(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>
    
    
    
    其次,当您切换构建变量时,对我来说,这是在“调试”和“发布”之间,您还需要将项目与Gradle文件同步。仅仅清理和重建项目是不够的


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

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

    如果有人想同时安装这两个版本,该怎么办。例如,应用程序的测试版?Hiya Shajeel。我从未尝试过,但我想你也会遇到同样的问题-除非你知道更多?事实上,问题在于清单中声明的提供程序的权限,在更改包后,我不得不手动更改权限,现在它正在工作。@ban geoengineering感谢朋友。。你今天救了我的命我已经为我的每种口味更改了应用程序ID。但我得到了上面提到的错误。这是可能的,我运行同一个应用程序在同一个设备不同的品种。在同一个设备中,哪个应用程序会作为不同的应用程序进行响应?@iDroidExplorer:问题在于内容提供商的权限。构建变体在这里并不直接重要——权限仍然必须是唯一的。不过,您可以在清单合并过程中使用占位符,使权限字符串基于构建变量的
    applicationId
    。例如,使用
    android:authorities=“${applicationId}.provider”将权限字符串作为附加了
    .provider
    applicationId`的权限字符串。除此之外,回答是:如果您正在使用facebook集成测试两个不同版本的应用程序,那么您可以登录到facebook开发者仪表板,转到您的应用程序,