INSTALL_FAILED_DUPLICATE_PERMISSION ... C2D_MESSAGE


179

Estoy usando notificaciones de Google en mi aplicación, y hasta ahora lo he hecho a continuación en el manifiesto:

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

Funcionó perfectamente hasta que actualicé mi Nexus 7 a Android 5.0.
Ahora, cuando intento instalar la aplicación en este dispositivo con Eclipse, aparece este error:

INSTALL_FAILED_DUPLICATE_PERMISSION perm = com.myapp.permission.C2D_MESSAGE pkg = com.myapp

No entiendo lo que está mal? Funcionaba perfectamente hasta Android 5.0.
Yo sé que estoy usando C2D_MESSAGEen dos líneas, permissiony uses-permissionaunque he copiado el código de la guía original de Google GCM, por lo que debe estar bien.


20
Lo que originalmente tomó para un error oscuro (bueno, lo hice ...) es en realidad una nueva característica de seguridad que impide que dos aplicaciones declaren el mismo permiso personalizado que está firmado con una firma diferente, para instalarse en un dispositivo
AZ_

Respuestas:


231

He encontrado una solución que me funciona.

En mi dispositivo (Nexus 7) Android 5.0. Lollipop Sigo estos pasos.

Después de desinstalar la aplicación, encontrará App Nameen la lista de aplicaciones de la Downloadedpestaña.

  • Ir a la configuración
  • Aplicaciones
  • Al final de la lista, encontrará YourAppuna etiqueta "NO INSTALADA"
  • Abierto
  • Haga clic OptionMenuy seleccione "Desinstalar para todos los usuarios"

Después de estos pasos, instalo con éxito la nueva aplicación y está funcionando bien.


66
Navego con el nexus 9 con Android 5.0.1 y no puedo ver mi aplicación con la etiqueta "no instalado"
xXJohnRamboXx

Esto funcionó para mí, gracias! Mi problema fue ligeramente diferente. Estoy haciendo pruebas automatizadas (Xamarin.UITest) en nuestra aplicación móvil, y cargué una versión diferente para algunas pruebas manuales. Cuando intenté cargar la aplicación (a través de VS / Xamarin UITest) en el dispositivo, comencé a ver este problema. Gracias de nuevo.
LuFaMa

Esta debería ser la respuesta correcta: stackoverflow.com/a/27767179/343679
Sharj

@Pratik Butani La solución funcionó para mí. Me gustaría saber la razón por la cual recibí el error. ¿Podría explicarlo?
Karthikeyan Ve

1
No encuentro mi aplicación al final de la lista con la etiqueta NO INSTALADA . ¿Qué quieres decir?
IgorGanapolsky

139

Eliminar

<uses-permission android:name="${applicationId}.permission.C2D_MESSAGE"/>
<permission
    android:name="${applicationId}.permission.C2D_MESSAGE"
    android:protectionLevel="signature"/>

Ejecutar aplicación ... Luego agregue el permiso nuevamente y ejecute la aplicación.

¡Listo!.


31
Esta respuesta debería estar en la parte superior ya que este problema a menudo ocurre cuando intenta instalar la versión de depuración y lanzamiento de su aplicación en el mismo dispositivo. Con esta solución puedes hacerlo fácilmente. No sabía que puedes usar variables en el manifiesto. ¡Votación a favor!
florian

44
Esta respuesta no funciona si la aplicación ya está en producción. No puedo esperar que los usuarios de mi aplicación descarguen una nueva versión sin los permisos y luego vuelvan a instalar una versión más nueva con los permisos.
nilsmagnus

55
Si esto está ocurriendo a usted porque usted tiene versiones de depuración y liberación de su aplicación con diferentes nombres, a continuación, una desinstalación no es necesario para que funcione: sólo tiene que utilizar el ${applicationId}lugar de codificar las que
yuval

1
¡El uso de $ {applicationId} en lugar de la identificación de la aplicación estática resolvió mi problema! Incluso cuando se usan sabores !!!!
JannGabriel

1
El comentario de @ yuval es perfecto y lo resolvió por mí. De las muchas respuestas, esta es la que mejor cubre el problema: stackoverflow.com/a/36992939/56285
Jonik

49

Tuve el mismo problema con un permiso de firma personalizado en Android-21 y lo resolví asegurándome de que estaba haciendo una desinstalación completa.

Este es un caso extremo que ocurre cuando:

  1. Una aplicación define un permiso personalizado utilizando seguridad de nivel de firma
  2. Intenta actualizar la aplicación instalada con una versión firmada con una clave diferente
  3. El dispositivo de prueba ejecuta Android 21 o posterior con soporte para múltiples usuarios

Ejemplo de línea de comando

Aquí hay una transcripción de línea de comandos que demuestra el problema y cómo resolverlo. En este punto, se instala una versión de depuración y estoy tratando de instalar una versión de producción firmada con la clave de lanzamiento:

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

Eclipse ejemplo

Yendo en la dirección opuesta (tratando de instalar una compilación de depuración de Eclipse cuando ya está instalada una compilación de lanzamiento), aparece el siguiente cuadro de diálogo:

Diálogo de reinstalación de Eclipse

Si solo responde sí en este punto, la instalación tendrá éxito.

Ejemplo de dispositivo

Como se señaló en otra respuesta, también puede ir a la página de información de la aplicación en la configuración del dispositivo, hacer clic en el menú de desbordamiento y seleccionar "Desinstalar para todos los usuarios" para evitar este error.


Gracias, pero debe comenzar su respuesta con "también puede ir a la página de información de una aplicación en la configuración del dispositivo, hacer clic en el menú de desbordamiento y seleccionar" Desinstalar para todos los usuarios "para evitar este error".
yajnesh

Cásate conmigo por favor. Después de su redacción, fui a Configuración> Aplicaciones, toque la versión anterior de la aplicación y en el menú de opciones seleccione "Desinstalar para todos los usuarios".
Fabricio PH

El número 2 de su lista de condiciones previas no tiene que ser cierto. En mi caso, no estoy actualizando la aplicación, sino instalando una compilación de depuración de la misma aplicación con un nombre de paquete diferente como se describe en este procedimiento. stackoverflow.com/a/21006552/507339 . Este es un problema para el que no veo una solución
Nilzor

33

He resuelto esto sin tener que recurrir a la desinstalación del apk alternativo primero (qué dolor, ¿verdad? Para instalar con éxito una versión de depuración y lanzamiento de un apk, simplemente use el marcador de posición $ {applicationId} incorporado de gradle en AndroidManifest.xml para modificar los valores de Android: nombre de los permisos en tiempo de compilación.

El fragmento de archivo build.gradle:

buildTypes {
    debug {
        applicationIdSuffix ".debug"
        ...
    }
}

El fragmento de archivo de AndroidStudio.xml:

<uses-permission android:name="${applicationId}.permission.C2D_MESSAGE"/>
<permission
    android:name="${applicationId}.permission.C2D_MESSAGE"
    android:protectionLevel="signature"/>

Puede inspeccionar el archivo AndroidManifest.xml modificado dentro de la aplicación apk aapt l -a app-debug.apkpara asegurarse de que el marcador de posición se haya aplicado correctamente. Si usa varios sabores de productos, estoy seguro de que puede aplicar una variación de este método para satisfacer sus necesidades.


parece que si defino diferente applicationIden dos diferentes productFlavors, y uso ${applicationId}el efecto será el mismo.
Robert

Creo que esta es una solución más sólida si necesita más de 1 sabor.
Robert

Esto debe marcarse como correcto. teniendo en cuenta que no se puede esperar que cada compañero de trabajo haga algunos trucos para simplemente construir un proyecto e instalar el apk
goemic

Gracias, @jackpile, la aplicación funciona perfectamente bien para mí. Solo hay un problema si hay versiones de lanzamiento y depuración instaladas, luego de instalar la versión de depuración, la versión de lanzamiento se abre en su lugar
Prateek Surana

esto debe marcarse como la respuesta correcta .. gracias @Jackpile
ahmed ewess

28

Elimine cualquier referencia "codificada" del nombre de su paquete de su archivo de manifiesto.

(Esta es la mejor práctica incluso si no la usa productFlavors)

Por ejemplo, si su manifiesto contiene:

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

Lo cambió a:

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

Luego, en el archivo gradle de su módulo, configure su relevante applicationId:

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

Puedes seguir este tutorial para más información.


2
usando ${applicationId}solucionó el problema para mí!
Andy

¿Cómo aborda esto el problema mencionado?
Vincent

18

intenta desinstalar la aplicación con adb:

adb uninstall com.yourpackage

Extraño, solo tenía que hacer esto en mi Nexus 6, a pesar de que había desinstalado mi APK a través de la interfaz de usuario del sistema y no aparecía en las aplicaciones instaladas.
Jon Willis

Me dio Failure [DELETE_FAILED_INTERNAL_ERROR]. ¿Cuál podría ser la razón?
Reaz Murshed

17

Al dar este error, mencionará claramente el nombre del paquete de la aplicación debido a que se le denegó el permiso. Y solo desinstalar la aplicación no resolverá el problema. Para resolver el problema, debemos realizar el siguiente paso:

  1. Ir a la configuración
  2. Ir a la aplicación
  3. Ir a la lista de aplicaciones descargadas
  4. Puedes ver la aplicación desinstalada en la lista
  5. Haga clic en la aplicación, vaya a más opciones
  6. Haga clic en desinstalar para ver todas las opciones de los usuarios .

Problema resuelto: D


8

Instalando una aplicación en OS 5.0 recibo este mensaje:

INSTALL_FAILED_DUPLICATE_PERMISSION perm=com.myapp.permission.C2D_MESSAGE pkg=com.myapp

No hay paquetes duplicados, y podemos resolver este problema desinstalando manualmente la aplicación anterior o usando el adb:

adb uninstall com.yourpackage


5

Nada de lo anterior funcionó para mí. Mi aplicación funcionaba bien en versiones anteriores a Lollipop. Pero cuando lo probé en Lollipop, apareció el error anterior. Se negó a instalar. No tenía ninguna versión anterior instalada, por lo que todas las soluciones anteriores no son válidas en mi caso. Pero gracias a esta solución SO ahora está funcionando bien. Al igual que la mayoría de los desarrolladores, seguí el tutorial engañoso de Google y agregué los permisos copiando y pegando así:

<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission android:name="com.google.android.permission.C2D_MESSAGE" 
            android:protectionLevel="signature" />

Esto funcionaría con versiones anteriores <Lollipop. Entonces ahora cambié a:

<uses-permission android:name="com.mycompany.myappname.c2dm.permission.RECEIVE" />
<permission android:name="com.mycompany.myappname.permission.C2D_MESSAGE" 
            android:protectionLevel="signature" />

4

CommonsWare tiene razón, pero en mi opinión, esta es una mala manera (error) de decir: "El apk instalado en el dispositivo está firmado con un certificado diferente al nuevo que está intentando instalar" .

Este es probablemente un nuevo error ya que en el pasado solía preguntar si desinstalar o no la aplicación del dispositivo debido a un certificado incorrecto.

La solución tan dolorosa como podría ser sería desinstalar la aplicación manualmente.

También lo que hemos hecho por el desarrollo del equipo, agregamos el almacén de claves de depuración a nuestro repositorio, y señalamos gradle para usarlo así:

android {
    ...
    signingConfigs {
        debug {
            storeFile file("../certificates/debug.keystore")
        }
    }

    ...

    buildTypes {
        debug {
            signingConfig signingConfigs.debug
        }
    }

    ...
}

Y ahora, al pasar dispositivos entre los miembros del equipo, todos usamos el mismo certificado de depuración, por lo que no hay problema. :)


4

En Android 5, verifique su configuración -> aplicaciones. En lugar de eliminar solo para el usuario activo (dado que Android 5 puede tener varios usuarios y mi teléfono tenía un usuario invitado), toque el botón accesorio en la esquina superior derecha de la barra de acciones / herramientas y elija "desinstalar para todos los usuarios". Parece que en Android 5 cuando solo desinstalas del iniciador, solo desinstalas la aplicación para el usuario activo.

La aplicación todavía está en el dispositivo ... Esto me dejó deslumbrado ya que estaba tratando de instalar una versión de lanzamiento, no funcionó, así que pensé que debía ser porque todavía tengo la versión de depuración instalada, desinstalé la aplicación. Pero aún no se pudo instalar. La primera pista fue un registro en la lista de aplicaciones de la aplicación desinstalada con el mensaje al lado de que se desinstaló (imagen).

La aplicación desinstalada sigue apareciendo en las aplicaciones Desinstalado para todos los usuarios


Sry, revisó tu comentario. Solo consideraremos esto como una publicación de información adicional con imágenes.
Jordy

2

Ver este enlace que dice que funcionará cuando estén firmados con la misma clave. La clave de liberación y la clave de depuración no son lo mismo.

Así que hazlo:

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


}

1

reemplace las siguientes líneas:

<permission android:name="com.myapp.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="com.myapp.permission.C2D_MESSAGE" 
android:protectionLevel="signature" /> 

1

En mi caso, tuve varias aplicaciones instaladas con el mismo nombre de dominio en el nombre del paquete de la siguiente manera.

com.mypackage.app1
com.mypackage.app2
com.mypackage.app3 
...

Tuve que desinstalar todas las aplicaciones con nombres de paquetes similares y volver a instalarlas para deshacerme del problema.

Para encontrar todos los nombres de paquetes del dispositivo, utilicé lo siguiente.

adb shell pm list packages

Luego agarré los paquetes que coinciden con el nombre de mi paquete que estoy buscando.

dumpsys | grep -A18 "Package \[com.mypackage\]"

Luego desinstaló todas las aplicaciones que tienen ese dominio.

uninstall com.mypackage.app1
uninstall com.mypackage.app2
uninstall com.mypackage.app3
...

También puede desinstalar las aplicaciones usando la Settingsaplicación. Ve a laSettings -> Apps -> Find the app -> Uninstall

Espero que ayude a alguien que tiene el mismo problema que yo.


0

Anteriormente solía decir que se encuentra una aplicación con firma diferente en el dispositivo. Al instalar desde IDE, también le preguntará si desea desinstalarlo.

Pero creo que desde Android 5.0 han cambiado el motivo de la desinstalación. No sucede si está instalando una aplicación con la misma firma


0

Encontré el mismo problema con un nexus 5 Android Lollipop 5.0.1:

Installation error: INSTALL_FAILED_DUPLICATE_PERMISSION perm=com.android.** pkg=com.android.**

Y en mi caso no pude solucionar este problema con uninstallingla aplicación porque era una android app, pero tuve que cambiar el custom permissionsnombre de mi aplicación enmanifest porque eran lo mismo que una aplicación de Android, que no pude desinstalar ni hacer ningún cambio.

Espero que esto ayude a alguien!


0

En mi caso recibí el siguiente error

Error de instalación: INSTALL_FAILED_DUPLICATE_PERMISSION perm = com.map.permission.MAPS_RECEIVE pkg = com.abc.Firstapp

Cuando intentaba instalar la aplicación que tiene el nombre del paquete com.abc.Secondapp. Aquí el punto fue que la aplicación con el nombre del paquete com.abc.Firstappya estaba instalada en mi aplicación.

Resolví este error desinstalando la aplicación con el nombre del paquete com.abc.Firstappy luego instalando la aplicación con el nombre del paquetecom.abc.Secondapp

Espero que esto ayude a alguien durante la prueba.


0

En su archivo AndroidManifest.xml, cambie los nombres de sus permisos especialmente declarados, por ejemplo:

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

a esto,

<!-- 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 esta parte resuelve el conflicto con su otra aplicación.


0

En mi caso, estaba usando una biblioteca de terceros (es decir, un proveedor) y la biblioteca viene con una aplicación de muestra que ya tenía instalada en mi dispositivo. Así que esa aplicación de muestra ahora entraba en conflicto cada vez que intento instalar mi propia aplicación que implementa la biblioteca. Así que acabo de desinstalar la aplicación de muestra del proveedor y funciona después.




0

Si tiene una versión diferente de la aplicación, intente desinstalarla primero. Esto me ayudó cuando tuve el mismo problema.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.