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.
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?
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.
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:
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é
il suffit de désinstaller l'application helloFacebooksample de votre appareil.
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
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.
Le grade doit également contenir cette
defaultConfig {
applicationId "com.example.app"
}
Je l'avais laissé complètement
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.