J'utilise les notifications Google dans mon application, et jusqu'à présent, je l'ai fait ci-dessous dans le manifeste:
<!-- GCM -->
<uses-permission Android:name="Android.permission.GET_ACCOUNTS" /> <!-- GCM requires a Google account. -->
<uses-permission Android:name="Android.permission.WAKE_LOCK" /> <!-- Keeps the processor from sleeping when a message is received. -->
<uses-permission Android:name="com.google.Android.c2dm.permission.RECEIVE" /> <!-- This app has permission to register and receive data message. -->
<!-- Creates a custom permission so only this app can receive its messages. NOTE: APP_PACKAGE.permission.C2D_MESSAGE -->
<permission Android:name="com.myapp.permission.C2D_MESSAGE" Android:protectionLevel="signature" />
<uses-permission Android:name="com.myapp.permission.C2D_MESSAGE" />
<!-- END GCM -->
Cela a fonctionné parfaitement jusqu'à ce que je mette à jour mon Nexus 7 vers Android 5.0.
Maintenant, lorsque j'essaie d'installer l'application sur cet appareil avec Eclipse, j'obtiens cette erreur:
INSTALL_FAILED_DUPLICATE_PERMISSION perm = com.myapp.permission.C2D_MESSAGE pkg = com.myapp
Je ne comprends pas ce qui ne va pas ... cela fonctionnait parfaitement jusqu'à Android 5.0.
Je sais que j’utilise C2D_MESSAGE
sur deux lignes, permission
et uses-permission
, mais j’ai copié ce code à partir du guide Google GCM d’origine, donc ça doit aller.
J'ai trouvé une solution qui fonctionne pour moi.
Dans mon appareil (Nexus 7) Android 5.0. Sucette Je suis les étapes ci-dessous.
Après la désinstallation de l'application, vous trouverez App Name
sous la liste des applications de l'onglet Downloaded
.
YourApp
avec un tag "NOT INSTALLED" OptionMenu
et sélectionnez "Désinstaller pour tous les utilisateurs" Après ce processus, j'ai correctement installé la nouvelle application et elle fonctionne bien.
Retirer
<uses-permission Android:name="${applicationId}.permission.C2D_MESSAGE"/>
<permission
Android:name="${applicationId}.permission.C2D_MESSAGE"
Android:protectionLevel="signature"/>
Exécutez App ....___, puis ajoutez à nouveau l'autorisation et exécutez App.
Prêt!.
J'ai eu le même problème avec une autorisation de signature personnalisée sur Android-21 et je l'ai résolu en m'assurant que je procédais à une désinstallation complète.
C'est un cas Edge qui se produit lorsque:
Voici une transcription en ligne de commande qui illustre le problème et comment le résoudre. À ce stade, une version de débogage est installée et j'essaie d'installer une version de production signée avec la clé de publication:
# This fails because the debug version defines the custom permission signed with a different key:
[root@localhost svn-Android-apps]# . androidbuildscripts/my-adb-install Example release
920 KB/s (2211982 bytes in 2.347s)
pkg: /data/local/tmp/Example-release.apk
Failure [INSTALL_FAILED_DUPLICATE_PERMISSION perm=com.example.Android.example.PERMISSION_EXAMPLE_PLUGIN pkg=com.example.Android.example]
# I use uninstall -k because apparently that is similar to uninstalling as a user
# by dragging the app out of the app tray:
[root@localhost svn-Android-apps]# /Android-sdk-linux/platform-tools/adb uninstall -k com.example.Android.example
The -k option uninstalls the application while retaining the data/cache.
At the moment, there is no way to remove the remaining data.
You will have to reinstall the application with the same signature, and fully uninstall it.
If you truly wish to continue, execute 'adb Shell pm uninstall -k com.example.Android.example'
# Let's go ahead and do that:
[root@localhost svn-Android-apps]# /Android-sdk-linux/platform-tools/adb Shell pm uninstall -k com.example.Android.example
Success
# This fails again because the custom permission apparently is part of the data/cache
# that was not uninstalled:
[root@localhost svn-Android-apps]# . androidbuildscripts/my-adb-install Example release
912 KB/s (2211982 bytes in 2.367s)
pkg: /data/local/tmp/Example-release.apk
Failure [INSTALL_FAILED_DUPLICATE_PERMISSION perm=com.example.Android.example.PERMISSION_EXAMPLE_PLUGIN pkg=com.example.Android.example]
# In spite of the warning above, simply doing a full uninstall at this point turned out to
# work (for me):
[root@localhost svn-Android-apps]# /Android-sdk-linux/platform-tools/adb uninstall com.example.Android.example
Success
# Release version now successfully installs:
[root@localhost svn-Android-apps]# . androidbuildscripts/my-adb-install Example release
898 KB/s (2211982 bytes in 2.405s)
pkg: /data/local/tmp/Example-release.apk
Success
[root@localhost svn-Android-apps]#
En allant dans le sens opposé (essayer d'installer une version de débogage d'Eclipse lorsqu'une version de version est déjà installée), j'obtiens la boîte de dialogue suivante:
Si vous répondez simplement oui à ce stade, l'installation réussira.
Comme indiqué dans une autre réponse, vous pouvez également accéder à une page d'informations sur l'application dans les paramètres du périphérique, cliquer sur le menu débordement et sélectionner "Désinstaller pour tous les utilisateurs" pour éviter cette erreur.
J'ai résolu ce problème sans avoir à recourir à la désinstallation préalable de l'autre apk (quelle douleur, non?). Pour installer avec succès à la fois une version de débogage et une version finale d'un apk, utilisez simplement l'espace réservé $ {applicationId} de gradle dans le fichier AndroidManifest.xml pour modifier les valeurs Android: name des autorisations lors de la compilation.
L'extrait de fichier build.gradle:
buildTypes {
debug {
applicationIdSuffix ".debug"
...
}
}
L'extrait de fichier AndroidStudio.xml:
<uses-permission Android:name="${applicationId}.permission.C2D_MESSAGE"/>
<permission
Android:name="${applicationId}.permission.C2D_MESSAGE"
Android:protectionLevel="signature"/>
Vous pouvez inspecter le fichier AndroidManifest.xml modifié dans l'apk à l'aide de aapt l -a app-debug.apk
pour vous assurer que l'espace réservé a été correctement appliqué. Si vous utilisez différents types de produits, je suis certain que vous pouvez appliquer une variante de cette méthode à vos besoins.
Supprimez toute référence "Hard Coded" du nom de votre paquet, de votre fichier manifeste.
(C'est la meilleure pratique même si vous n'utilisez pas productFlavors
)
Par exemple, si votre manifeste contient:
<uses-permission Android:name="com.google.Android.c2dm.permission.RECEIVE"/>
<uses-permission Android:name="com.yourpackage.name.permission.C2D_MESSAGE"/>
<permission
Android:name="com.yourpackage.name.permission.C2D_MESSAGE"
Android:protectionLevel="signature"/>
<permission
Android:name="com.yourpackage.name.permission.MAPS_RECEIVE"
Android:protectionLevel="signature"/>
Changé pour:
<uses-permission Android:name="com.google.Android.c2dm.permission.RECEIVE"/>
<uses-permission Android:name="${applicationId}.permission.C2D_MESSAGE"/>
<permission
Android:name="${applicationId}.permission.C2D_MESSAGE"
Android:protectionLevel="signature"/>
<permission
Android:name="${applicationId}.permission.MAPS_RECEIVE"
Android:protectionLevel="signature"/>
Ensuite, dans votre fichier de gradation de module, définissez votre applicationId
appropriée:
signingConfigs {
stage {
storeFile file('keystore/stage.keystore')
storePassword 'Android'
keyAlias 'androiddebugkey'
keyPassword 'Android'
}
production {
storeFile file('keystore/playstore.keystore')
storePassword store_password
keyAlias key_alias
keyPassword key_password
}
}
productFlavors {
staging {
signingConfig signingConfigs.staging
applicationId defaultConfig.applicationId + ".staging"
versionName defaultConfig.versionName + "-staging"
}
production {
signingConfig signingConfigs.production
}
}
Tout en donnant cette erreur, il mentionnera clairement le nom du package de l'application à cause duquel l'autorisation a été refusée. Et la simple désinstallation de l'application ne résoudra pas le problème. Afin de résoudre le problème, nous devons procéder comme suit:
Problème résolu: D
essayez de désinstaller l'application avec adb:
adb uninstall com.yourpackage
Installer une application sous OS 5.0, je reçois le message suivant:
INSTALL_FAILED_DUPLICATE_PERMISSION perm=com.myapp.permission.C2D_MESSAGE pkg=com.myapp
Il n'y a pas de paquets dupliqués, et nous pouvons résoudre ce problème en désinstallant manuellement l'ancienne application ou en utilisant l'adb:
adb uninstall com.yourpackage
Dans Android 5, vérifiez vos paramètres -> applications. Au lieu de supprimer pour l'utilisateur actif uniquement (car Android 5 peut être utilisé par plusieurs utilisateurs et que mon téléphone dispose d'un utilisateur invité), appuyez sur le bouton de l'accessoire dans le coin supérieur droit de la barre d'action/d'outils et choisissez "désinstaller pour tous les utilisateurs". Il semble que dans Android 5, lorsque vous désinstallez simplement Lanceur, vous ne désinstallez l’application que pour l’utilisateur actif.
L'application est toujours sur l'appareil .. Cela m'avait ébloui depuis que j'essayais d'installer une version, cela ne fonctionnait pas, alors je me suis dit que c'est correct, car j'ai toujours la version de débogage installée, j'ai désinstallé l'application. Mais cela n’est toujours pas possible d’installer. Le premier indice était un enregistrement dans la liste des applications de l’application désinstallée avec le message à côté qu’elle avait été désinstallée (image).
CommonsWare a raison, mais à mon avis, il s'agit d'une mauvaise façon de dire: "L'apk installé sur l'appareil est signé avec un certificat différent de celui que vous essayez d'installer" .
Il s’agit probablement d’un nouveau bogue, car il demandait autrefois de désinstaller l’application de l’appareil en raison d’un mauvais certificat.
La solution, aussi pénible soit-elle, serait de désinstaller l'application manuellement.
De plus, nous avons également ajouté le magasin de clés de débogage à notre référentiel afin de développer l’équipe, et nous avons utilisé graduel pour l’utiliser de la manière suivante:
Android {
...
signingConfigs {
debug {
storeFile file("../certificates/debug.keystore")
}
}
...
buildTypes {
debug {
signingConfig signingConfigs.debug
}
}
...
}
Et maintenant, lorsque nous passons des périphériques entre les membres de l'équipe, nous utilisons tous le même certificat de débogage, il n'y a donc aucun problème. :)
Aucun de ce qui précède n'a fonctionné pour moi. Mon application fonctionnait bien avant Lollipop. Mais lorsque je l'ai testé sur Lollipop, l'erreur ci-dessus s'est produite. Il a refusé d'installer. Je n'avais aucune version précédente installée de sorte que toutes les solutions ci-dessus ne sont pas valables dans mon cas. Mais grâce à cette SO solution maintenant, il fonctionne bien. Comme la plupart des développeurs, j'ai suivi le didacticiel trompeur de Google et j'ai ajouté les autorisations par copier/coller de la manière suivante:
<uses-permission Android:name="com.google.Android.c2dm.permission.RECEIVE" />
<permission Android:name="com.google.Android.permission.C2D_MESSAGE"
Android:protectionLevel="signature" />
Cela fonctionnerait avec les anciennes versions <Lollipop. Alors maintenant j'ai changé pour:
<uses-permission Android:name="com.mycompany.myappname.c2dm.permission.RECEIVE" />
<permission Android:name="com.mycompany.myappname.permission.C2D_MESSAGE"
Android:protectionLevel="signature" />
Voir ce lien il a dit que cela fonctionnera quand ils sont signés par la même clé. La clé de libération et la clé de débogage ne sont pas identiques.
Alors faites-le:
buildTypes {
release {
minifyEnabled true
signingConfig signingConfigs.release//signing by the same key
proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-Android.txt'
}
debug {
applicationIdSuffix ".debug"
debuggable true
signingConfig signingConfigs.release//signing by the same key
}
}
signingConfigs {
release {
storeFile file("***\\key_.jks")
storePassword "key_***"
keyAlias "key_***"
keyPassword "key_"***"
}
}
remplacer les lignes ci-dessous:
<permission Android:name="com.myapp.permission.C2D_MESSAGE" Android:protectionLevel="signature" />
<uses-permission Android:name="com.myapp.permission.C2D_MESSAGE"
Android:protectionLevel="signature" />
J'ai rencontré le même problème avec un Nexus 5 Android Lollipop 5.0.1:
Installation error: INSTALL_FAILED_DUPLICATE_PERMISSION perm=com.Android.** pkg=com.Android.**
Et dans mon cas, je ne pouvais pas résoudre ce problème avec l'application uninstalling
car il s'agissait d'un Android app
, mais je devais modifier le nom de l'application custom permissions
dans manifest
car ils étaient identiques à ceux d'une application Android, que je ne pouvais pas désinstaller ni modifier .
J'espère que cela aide quelqu'un!
J'ai désinstallé la version précédente. Cela a fonctionné pour moi.
Dans mon cas, j’utilisais une bibliothèque tierce (c’est-à-dire un fournisseur) et la bibliothèque est livrée avec un exemple d’application que j’avais déjà installé sur mon appareil. Cet exemple d'application était donc en conflit à chaque fois que j'essayais d'installer ma propre application mettant en œuvre la bibliothèque. J'ai donc simplement désinstallé l'exemple d'application du fournisseur et cela fonctionne par la suite.
Dans mon cas, j'ai reçu l'erreur suivante
Erreur d'installation: INSTALL_FAILED_DUPLICATE_PERMISSION perm = com.map.permission.MAPS_RECEIVE pkg = com.abc.Firstapp
Quand j'essayais d'installer l'application qui porte le nom de package com.abc.Secondapp
. Ici, c’est que l’application avec le nom de paquetage com.abc.Firstapp
était déjà installée dans mon application.
J'ai résolu cette erreur en désinstallant l'application avec le nom de package com.abc.Firstapp
, puis en installant l'application avec le nom de package com.abc.Secondapp
.
J'espère que cela aidera quelqu'un lors des tests.
Auparavant, cela signifiait qu'une application avec une signature différente se trouvait sur l'appareil. Lors de l'installation à partir de IDE, il vous serait également demandé si vous souhaitez le désinstaller.
Mais je pense que depuis Android 5.0, ils ont changé la raison de la désinstallation. Cela ne se produit pas si vous installez une application avec la même signature
Dans votre fichier AndroidManifest.xml, modifiez les noms de vos autorisations spécialement déclarées, par exemple:
<!-- Creates a custom permission so only this app can receive its messages. NOTE: APP_PACKAGE.permission.C2D_MESSAGE -->
<permission Android:name="com.myapp.permission.C2D_MESSAGE" Android:protectionLevel="signature" />
<uses-permission Android:name="com.myapp.permission.C2D_MESSAGE" />
<!-- END GCM -->
pour ça,
<!-- Creates a custom permission so only this app can receive its messages. NOTE: APP_PACKAGE.permission.C2D_MESSAGE -->
<permission Android:name="com.myapprocks.permission.C2D_MESSAGE" Android:protectionLevel="signature" />
<uses-permission Android:name="com.myapprocks.permission.C2D_MESSAGE" />
<!-- END GCM -->
com.myapprocks cette partie résout le conflit avec votre autre application.
J'ai redémarré mon téléphone après avoir désinstallé l'application et cela a fonctionné