INSTALL_FAILED_DUPLICATE_PERMISSION… C2D_MESSAGE

179

Estou usando as notificações do Google no meu aplicativo e, até agora, fiz isso abaixo no manifesto:

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

Funcionou perfeitamente até atualizar meu Nexus 7 para o Android 5.0.
Agora, quando tento instalar o aplicativo neste dispositivo com o Eclipse, recebo este erro:

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

Eu não entendo o que está errado? Estava funcionando perfeitamente até o Android 5.0.
Sei que estou usando C2D_MESSAGEem duas linhas permissione , uses-permissionmas copiei esse código do guia original do Google GCM, por isso deve estar bem.

Null Pointer Exception
fonte
20
O que você pegou originalmente para um bug obscuro (bem, eu fiz ...) é na verdade um novo recurso de segurança que impede que dois aplicativos declarem a mesma permissão personalizada assinada com uma assinatura diferente, para serem instalados em um dispositivo
AZ_

Respostas:

231

Eu encontrei uma solução que funciona para mim.

No meu dispositivo (Nexus 7), Android 5.0. Pirulito sigo estes passos.

Após a desinstalação do aplicativo, você encontrará App Nameem Lista de aplicativos da Downloadedguia.

  • Vá para as configurações
  • Apps
  • No final da lista, você encontrará YourAppuma tag "NÃO INSTALADO"
  • Abrir
  • Clique em OptionMenue selecione "Desinstalar para todos os usuários"

Após essas etapas, instalei com êxito o novo aplicativo e ele está funcionando bem.

Pratik Butani
fonte
6
I nexo nave 9 com Android 5.0.1 e eu não posso ver meu aplicativo com "noto instalado" tag
xXJohnRamboXx
Isso funcionou para mim, obrigado! Meu problema foi um pouco diferente. Estou fazendo testes automatizados (Xamarin.UITest) em nosso aplicativo móvel e carreguei uma versão diferente para alguns testes manuais. Quando tentei carregar o aplicativo (via VS / Xamarin UITest) no dispositivo, comecei a ver esse problema. Obrigado novamente.
LuFaMa
Este deve ser a resposta correta: stackoverflow.com/a/27767179/343679
Sharj
@Pratik Butani A solução funcionou para mim. Gostaria de saber o motivo para obter o erro? Você poderia explicar?
precisa
1
Não encontro meu aplicativo no final da lista com a tag NÃO INSTALADO . O que você quer dizer?
IgorGanapolsky
139

Remover

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

Executar aplicativo ... Em seguida, adicione o permisson novamente e execute o aplicativo.

Pronto!.

Delmirio Segura
fonte
31
Esta resposta deve estar no topo, pois esse problema geralmente ocorre quando você tenta instalar a versão de depuração e lançamento do seu aplicativo no mesmo dispositivo. Com esta solução, você pode fazer isso facilmente. Eu não sabia que você pode usar variáveis ​​no manifesto. Voto a favor!
florian 12/03
4
Esta resposta não funcionará se o aplicativo já estiver em produção. Não posso esperar que os usuários do meu aplicativo baixem uma nova versão sem as permissões e depois instalem uma versão mais nova com as permissões novamente.
Nilsmagnus
5
Se isso está acontecendo com você porque você tem versões de depuração e lançamento do aplicativo com nomes diferentes, não é necessário desinstalar para que ele funcione: você só precisa usar o em ${applicationId}vez de
codificá-
1
Usando $ {applicationId} em vez de ID estático do aplicativo resolveu meu problema !! Incluindo ao usar sabores !!!!
JannGabriel
1
O comentário de @ yuval está no local e resolveu isso para mim. Fora da resposta muitos, este melhores capas a questão: stackoverflow.com/a/36992939/56285
Jonik
49

Eu tive o mesmo problema com uma permissão de assinatura personalizada no Android-21 e a resolvi, certificando-me de que estava fazendo uma desinstalação completa.

Este é um caso extremo que ocorre quando:

  1. Um aplicativo define uma permissão personalizada usando segurança no nível de assinatura
  2. Você tenta atualizar o aplicativo instalado com uma versão assinada com uma chave diferente
  3. O dispositivo de teste está executando o Android 21 ou mais recente, com suporte para vários usuários

Exemplo de linha de comando

Aqui está uma transcrição da linha de comando que demonstra o problema e como resolvê-lo. Neste ponto, uma versão de depuração está instalada e estou tentando instalar uma versão de produção assinada com a chave de lançamento:

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

Exemplo do Eclipse

Indo na direção oposta (tentando instalar uma compilação de depuração do Eclipse quando uma compilação de versão já está instalada), recebo o seguinte diálogo:

Diálogo de reinstalação do Eclipse

Se você responder sim neste momento, a instalação será bem-sucedida.

Exemplo de dispositivo

Conforme indicado em outra resposta, você também pode acessar uma página de informações do aplicativo nas configurações do dispositivo, clicar no menu excedente e selecionar "Desinstalar para todos os usuários" para evitar esse erro.

código x
fonte
Obrigado, mas você deve iniciar sua resposta com "você também pode acessar uma página de informações do aplicativo nas configurações do dispositivo, clicar no menu excedente e selecionar" Desinstalar para todos os usuários "para evitar esse erro".
yajnesh
Case comigo, por favor. Após sua redação, fui para Configurações> Aplicativos, toque na versão antiga do aplicativo e, no menu de opções, selecione "Desinstalar para todos os usuários".
Fabricio PH
O nº 2 da sua lista de pré-condições não precisa ser verdadeiro. No meu caso, não estou atualizando o aplicativo, mas instalando uma compilação de depuração do mesmo aplicativo com um nome de pacote diferente, conforme descrito neste procedimento. stackoverflow.com/a/21006552/507339 . Este é um problema para o qual não encontro uma solução.
Nilzor
33

Eu resolvi isso sem ter que recorrer à desinstalação do apk alternativo primeiro (que dor, certo?). Para instalar com êxito uma versão de depuração e lançamento de um apk, basta usar o espaço reservado $ {applicationId} interno do gradle no AndroidManifest.xml para modificar os valores android: name das permissões em tempo de compilação.

O trecho de arquivo build.gradle:

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

O trecho de arquivo AndroidStudio.xml:

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

Você pode inspecionar o arquivo AndroidManifest.xml modificado no apk usando aapt l -a app-debug.apkpara garantir que o espaço reservado foi aplicado corretamente. Se você usar vários tipos de produtos, tenho certeza de que pode aplicar uma variação desse método para atender às suas necessidades.

Jackpile
fonte
parece que se eu definir diferente applicationIdem dois diferentes productFlavors, e usar ${applicationId}o efeito será o mesmo.
Robert
Eu acho que essa é uma solução mais robusta se você precisar de mais de um sabor.
Robert
isso deve ser marcado como correto. considerando que não se pode esperar de cada colega de trabalho para fazer algumas arounds de hackers simplesmente construir um projeto e instalar o apk
goemic
Obrigado, @jackpile o aplicativo é executado perfeitamente bem para mim não é apenas um problema se existem tanto liberação e compilações de depuração instalado, em seguida, depois de instalar a compilação de depuração da compilação de lançamento abre vez
Prateek Surana
este deve ser marcado como a resposta correta .. obrigado @Jackpile
Ahmed ewess
28

Remova qualquer referência "codificada" do nome do seu pacote, do arquivo de manifesto.

(Essa é uma prática recomendada mesmo que você não esteja usando productFlavors)

Por exemplo, se o seu manifesto contiver:

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

Alterou para:

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

Em seguida, no seu arquivo gradle do módulo, defina seu 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
    }
}

Você pode seguir este tutorial para obter mais informações

David
fonte
2
usando ${applicationId}corrigiu o problema para mim!
22416 Andy
Como isso soluciona o problema mencionado?
Vincent
18

tente desinstalar o aplicativo com adb:

adb uninstall com.yourpackage
Giuseppe
fonte
Estranho, eu apenas precisei fazer isso no meu Nexus 6, apesar de ter desinstalado o APK através da interface do sistema e ele não estava aparecendo nos aplicativos instalados.
Jon Willis
Isso me deu Failure [DELETE_FAILED_INTERNAL_ERROR]. O que pode ser a razão?
Reaz Murshed
17

Ao fornecer esse erro, ele mencionará claramente o nome do pacote do aplicativo, devido ao qual a permissão foi negada. E apenas desinstalar o aplicativo não resolverá o problema. Para resolver o problema, precisamos fazer o seguinte passo:

  1. Vá para as configurações
  2. Vá para o aplicativo
  3. Vá para a lista de aplicativos baixados
  4. Você pode ver o aplicativo desinstalado na lista
  5. Clique no aplicativo, vá para mais opções
  6. Clique em desinstalar para ver todas as opções de usuários

Problema resolvido: D

Preethi Rao
fonte
8

Instalando um aplicativo no OS 5.0, recebo esta mensagem:

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

Não há pacotes duplicados, e podemos resolver esse problema desinstalando manualmente o aplicativo antigo ou usando o adb:

adb uninstall com.yourpackage

Jorgesys
fonte
5

Nenhuma das opções acima funcionou para mim. Meu aplicativo estava funcionando bem antes do Lollipop. Mas quando eu testei no Lollipop, o erro acima surgiu. Ele se recusou a instalar. Eu não tinha nenhuma versão anterior instalada, portanto, todas as soluções acima são inválidas no meu caso. Mas, graças a esta solução SO, agora está funcionando bem. Assim como a maioria dos desenvolvedores, segui o tutorial enganoso do Google e adicionei as permissões copiando e colando assim:

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

Isso funcionaria com versões mais antigas <Lollipop. Então agora eu mudei para:

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

O CommonsWare está certo, mas, na minha opinião, esta é uma maneira ruim (de erro) de dizer: "O apk instalado no dispositivo é assinado com um certificado diferente do certificado que você está tentando instalar" .

Este é provavelmente um novo bug, pois no passado costumava perguntar se desinstalava ou não o aplicativo do dispositivo devido a um certificado errado.

A solução mais dolorosa possível é desinstalar o aplicativo manualmente.

Além disso, o que fizemos em prol do desenvolvimento da equipe, adicionamos o keystore de depuração ao nosso repositório e apontamos o gradle para usá-lo da seguinte forma:

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

    ...

    buildTypes {
        debug {
            signingConfig signingConfigs.debug
        }
    }

    ...
}

E agora, ao passar dispositivos entre os membros da equipe, todos usamos o mesmo certificado de depuração, portanto não há problema. :)

TacB0sS
fonte
4

No Android 5, verifique suas configurações -> aplicativos. Em vez de excluir apenas o usuário ativo (já que o Android 5 pode ter vários usuários e meu telefone tinha um usuário convidado), toque no botão acessório no canto superior direito da ação / barra de ferramentas e escolha "desinstalar para todos os usuários". Parece que no Android 5, quando você desinstala do iniciador, desinstala apenas o aplicativo para o usuário ativo.

O aplicativo ainda está no dispositivo. Isso me deixou deslumbrado, pois estava tentando instalar uma versão de lançamento e não funcionou. Por isso, pensei que devia estar porque ainda tenho a versão de depuração instalada e desinstalou o aplicativo. Mas ainda não foi possível instalar. A primeira pista foi um registro na lista de aplicativos do aplicativo desinstalado com a mensagem ao lado de que ele foi desinstalado (imagem).

Aplicativo desinstalado ainda aparecendo em aplicativos Desinstalado para todos os usuários

Jordy
fonte
Sry, olhou seu comentário. Consideraremos isso como uma publicação de informações extras com imagens.
Jordy
2

Veja este link e disse que funcionará quando eles forem assinados pela mesma chave. A chave de liberação e a chave de depuração não são as mesmas.

Então faça:

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


}
NickUnuchek
fonte
1

substitua as linhas abaixo:

<permission android:name="com.myapp.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="com.myapp.permission.C2D_MESSAGE" 
android:protectionLevel="signature" /> 
Sỹ Phạm
fonte
1

No meu caso, eu tinha vários aplicativos instalados com o mesmo nome de domínio no nome do pacote, como a seguir.

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

Eu tive que desinstalar todos os aplicativos com nomes de pacotes semelhantes e reinstalá-los novamente, a fim de se livrar do problema.

Para encontrar todos os nomes de pacotes do dispositivo, usei o seguinte.

adb shell pm list packages

Então peguei os pacotes que correspondem ao nome do pacote que estou procurando.

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

Em seguida, desinstale todos os aplicativos com esse domínio.

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

Você também pode desinstalar os aplicativos usando o Settings aplicativo. Vou aoSettings -> Apps -> Find the app -> Uninstall

Espero que ajude alguém com o mesmo problema que eu.

Reaz Murshed
fonte
0

Anteriormente, costumava-se dizer que um aplicativo com assinatura diferente é encontrado no dispositivo. Ao instalar a partir do IDE, ele também pergunta se deseja desinstalá-lo.

Mas acho que no Android 5.0 eles mudaram o motivo da desinstalação. Isso não acontece se você estiver instalando um aplicativo com a mesma assinatura

Yasir
fonte
0

Encontrei o mesmo problema com um Android Lollipop 5.0.1 do nexus 5:

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

E, no meu caso, não consegui resolver esse problema uninstallingdo aplicativo porque era um android app, mas tive que alterar o custom permissionsnome do aplicativo emmanifest porque eram iguais aos de um aplicativo Android, que não foi possível desinstalar ou fazer alterações.

Espero que isso ajude alguém!

Ultimo_m
fonte
0

No meu caso, recebi o seguinte erro

Erro de instalação: INSTALL_FAILED_DUPLICATE_PERMISSION perm = com.map.permission.MAPS_RECEIVE pkg = com.abc.Firstapp

Quando eu estava tentando instalar o aplicativo que tem o nome do pacote com.abc.Secondapp. Aqui o ponto foi que o aplicativo com o nome do pacote com.abc.Firstappjá estava instalado no meu aplicativo.

Resolvi esse erro desinstalando o aplicativo com o nome do pacote com.abc.Firstappe instalando o aplicativo com o nome do pacotecom.abc.Secondapp

Espero que isso ajude alguém durante o teste.

Abhinav Singh Maurya
fonte
0

No seu arquivo AndroidManifest.xml, altere os nomes das permissões especialmente declaradas, por exemplo:

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

para isso,

<!-- 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 resolve o conflito com seu outro aplicativo.

resw67
fonte
0

No meu caso, eu estava usando uma biblioteca de terceiros (ou seja, fornecedor) e a biblioteca vem com um aplicativo de amostra que eu já tinha instalado no meu dispositivo. Portanto, esse aplicativo de amostra estava em conflito toda vez que tento instalar meu próprio aplicativo implementando a biblioteca. Acabei de desinstalar o aplicativo de exemplo do fornecedor e ele funciona depois.

Nouvel Travay
fonte
0

Eu desinstalei a versão anterior. Funcionou para mim.

Sushil Dhayal
fonte
0

Reiniciei meu telefone depois de desinstalar o aplicativo e ele funcionou

Pedro Martins
fonte
0

Se você tem um sabor diferente do aplicativo, tente desinstalá-lo primeiro. Isso me ajudou quando tive o mesmo problema.

olleh
fonte