web-dev-qa-db-fra.com

INSTALL_FAILED_CONFLICTING_PROVIDER sous Android

J'utilise un code open-source de Google pour une application appelée MyTracks.

Je reçois cette erreur lorsque l'application d'origine est installée sur le téléphone.

INSTALL_FAILED_CONFLICTING_PROVIDER

Je sais que cela est dû au Android:authorities dans le manifeste.

voici la partie du manifeste:

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

Ma question est donc la suivante: je veux savoir si cette approche peut résoudre le problème ou non, car je crains de changer tous les noms de paquets et de voir ensuite toute l'application brisée.

  1. La valeur Android :authorities est le nom du package. Le Android:name est le nom de la classe de ce fournisseur. Ai-je raison?

Si je remplace le nom du package par un autre que com.google etx et renomme toutes les références/importations de ce package, le problème devrait-il disparaître?

15
ghostrider

La valeur Android: autorités est le nom du package.

Dans ce cas, il arrive soit le nom du paquet. Cela doit simplement être unique.

L'Android: nom est le nom de la classe de ce fournisseur

Correct.

Si je remplace le nom du package par un autre que com.google etx et renomme toutes les références/importations de ce package, le problème devrait-il disparaître?

Le nom du paquet n'a rien à voir avec ça. Cependant, vous devrez peut-être également changer cela pour que votre application puisse être installée parallèlement à l'application standard non modifiée.

Vous devez avoir une valeur unique pour Android:authorities et le code de votre application qui utilise cette ContentProvider doit utiliser une Uri (content://whatever.you.change.the.authority.to/...) appropriée.

29
CommonsWare

Si vous utilisez Google Maps + Services Google Play dans un projet de bibliothèque, vous pouvez rencontrer cette erreur lorsque vous essayez d'exécuter une application utilisant votre bibliothèque, alors qu'une autre application utilisant la même bibliothèque est déjà installée sur votre appareil.

Correction: Assurez-vous que defaultConfig.applicationId est défini dans la section Android du fichier build.gradle pour chaque projet utilisant votre bibliothèque.

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

Je recommanderais d'utiliser le nom du package de l'application spécifique. Avec ce correctif, les noms de fournisseur ne seront plus en conflit et votre application s'exécutera comme prévu.

Symptômes

1.) Vos utilisateurs constatent l'erreur d'installation "-505" tant redoutée lors de l'installation de votre application à partir du Play Store.

2.) Vous verrez ce message d'erreur lorsque vous essayez d'installer une deuxième application qui utilise votre bibliothèque via Android Studio:

 enter image description here

Dans votre console, vous verrez un message comme celui-ci:

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

Le correctif consiste à vérifier que defaultConfig.applicationId est défini dans la section Android du fichier build.gradle pour chaque projet utilisant votre bibliothèque

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

Vous trouverez plus de lectures ici dans le rapport de bogue d'origine: Issue 784: Plusieurs applications utilisant le même nom de fournisseur d'autorité

5
DiscDev

il suffit de désinstaller l'application helloFacebooksample de votre appareil.

5
Sourabh

si vous utilisez pour ex-facebook-sdk , vous avez besoin que cette ligne soit unique dans le manifeste 

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

xxxxxxxxxx - devrait être unique pour chaque application, pour facebook-sdk c'est votre numéro facebook_id

4
NickUnuchek

J'ai eu la même erreur quand j'ai changé le nom du paquet dans le manifeste de mon application. Cela crée un conflit lorsque vous essayez d'installer à nouveau l'application (avec le nouveau nom de package). La solution consiste à supprimer l'ancienne version de l'application (qui utilise l'ancien nom du package), pour pouvoir installer la nouvelle version.

2
ban-geoengineering

Le grade doit également contenir cette 

defaultConfig {
  applicationId "com.example.app"
}

Je l'avais laissé complètement 

1
Krupa

CommonsWare a raison, cependant, il y a plus de détails qui peuvent aider.

Pour moi, la solution comportait deux éléments clés: J'ai d'abord ajouté $ (applicationId) à l'entrée du fournisseur de manifeste:

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

Deuxièmement, lorsque vous changez de construction, vous devez également synchroniser le projet avec des fichiers Gradle. Il ne suffisait pas de simplement nettoyer et reconstruire le projet.

Dans Android Studio, il y a deux onglets au bas de la page AndroidManifest.xml. L'onglet "Texte" que vous utilisez pour modifier et l'onglet "Fusionné" montre le manifeste résultant après la génération, et pour moi, je constate qu'il injecte correctement l'applicationId dans la section Android: autorités du fournisseur.

0
MobileMateo