web-dev-qa-db-fra.com

INSTALL_FAILED_DUPLICATE_PERMISSION ... C2D_MESSAGE

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.

167

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

  • Aller aux paramètres 
  • Applications 
  • Au bas de la liste, vous trouverez YourApp avec un tag "NOT INSTALLED" 
  • Ouvrir 
  • Cliquez sur 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.

221
Pratik Butani

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

132
Delmirio Segura

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:

  1. Une application définit une autorisation personnalisée à l'aide d'une sécurité au niveau de la signature
  2. Vous essayez de mettre à jour l'application installée avec une version signée avec une clé différente
  3. L'appareil de test exécute Android 21 ou une version plus récente avec une prise en charge de plusieurs utilisateurs.

Exemple de ligne de commande

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

Exemple Eclipse

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:

Eclipse reinstall dialog

Si vous répondez simplement oui à ce stade, l'installation réussira.

Exemple d'appareil

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.

47
x-code

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.

32
Jackpile

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

Vous pouvez suivre ce tutoriel pour plus d'informations

23
David

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:

  1. Aller aux paramètres 
  2. Aller à l'App 
  3. Accéder à la liste des applications téléchargées 
  4. Vous pouvez voir l'application désinstallée dans la liste 
  5. Cliquez sur l'application, allez à plus d'option 
  6. Cliquez sur désinstaller pour tous les utilisateurs options

Problème résolu: D 

17
Preethi Rao

essayez de désinstaller l'application avec adb:

adb uninstall com.yourpackage
16
Giuseppe

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

8
Elenasys

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

Uninstalled app still showing up in appsUninstalled for all users

4
Jordy

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. :)

4
TacB0sS

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

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_"***"
        }


}
2
NickUnuchek

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" /> 
0
Sỹ Phạm

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!

0
Ultimo_m

J'ai désinstallé la version précédente. Cela a fonctionné pour moi.

0
Sushil Dhayal

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.

0
Nouvel Travay

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.

0

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

0
Yasir

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.

0
resw67

J'ai redémarré mon téléphone après avoir désinstallé l'application et cela a fonctionné

0
Pedro Martins