android - google - INSTALL_FAILED_DUPLICATE_PERMISSION... C2D_MESSAGE
android push notifications (20)
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 qué está mal ... funcionó perfectamente hasta Android 5.0.
Sé que estoy usando
C2D_MESSAGE
en dos líneas,
permission
y
uses-permission
pero he copiado ese código de la guía original de GCM de Google, por lo que debe estar bien.
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:
- Ir a la configuración
- Ir a la aplicación
- Ir a la lista de aplicaciones descargadas
- Puedes ver la aplicación desinstalada en la lista
- Haga clic en la aplicación, vaya a más opciones
- Haga clic en desinstalar para ver todas las opciones de los usuarios .
Problema resuelto: D
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
CommonsWare tiene razón, pero en mi opinión, esta es una mala manera (error) de decir: "La apk instalada en el dispositivo está firmada con un certificado diferente al nuevo que está intentando instalar" .
Este es probablemente un error nuevo 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. :)
Desinstalé la versión anterior. A mi me funciono.
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!.
Elimine cualquier referencia "codificada" del nombre de su paquete de su archivo de manifiesto.
(Esta es la mejor práctica incluso si no 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 ID de
applicationId
relevante:
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
}
}
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 instalada la versión de depuración, 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).
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.Firstapp
ya estaba instalada en mi aplicación.
com.abc.Firstapp
este error desinstalando la aplicación con el nombre del paquete
com.abc.Firstapp
y luego instalando la aplicación con el nombre del paquete
com.abc.Secondapp
Espero que esto ayude a alguien durante la prueba.
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.
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.
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
uninstalling
la aplicación porque era una
android app
, pero tuve que cambiar el nombre de los
custom permissions
aplicación en
manifest
porque eran lo mismo que una aplicación de Android, lo que no pude desinstalar o hacer cualquier cambio.
Espero que esto ayude a alguien!
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á el
App Name
aplicación en la lista de aplicaciones de la pestaña
Downloaded
.
- Ir a la configuración
- Aplicaciones
-
Al final de la lista encontrará
YourApp
con una etiqueta "NO INSTALADA" - Abierto
-
Haga clic en
OptionMenu
y seleccione "Desinstalar para todos los usuarios"
Después de ese proceso, instalé con éxito la nueva aplicación y está funcionando bien.
He resuelto esto sin tener que recurrir a la desinstalación de la apk alternativa 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 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 usando
aapt l -a app-debug.apk
para 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.
Instalando una aplicación en OS 5.0 me sale 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
Nada de lo anterior funcionó para mí. Mi aplicación funcionaba bien antes que 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" />
Reinicié mi teléfono después de desinstalar la aplicación y funcionó
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:
- Una aplicación define un permiso personalizado utilizando seguridad de nivel de firma
- Intenta actualizar la aplicación instalada con una versión firmada con una clave diferente
- 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:
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.
Vea este link 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_"***"
}
}
intenta desinstalar la aplicación con adb:
adb uninstall com.yourpackage
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" />