INSTALL_FAILED_DUPLICATE_PERMISSION ... C2D_MESSAGE

? AndroidUser99 @ | Original: StackOverFlow

Sto usando le notifiche di Google nella mia app, e fino ad ora ho avuto questo nel 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 -->

Ha funzionato perfettamente fino a quando ho aggiornato il mio Nexus 7 ad Android 5.0 . Ora, quando provo ad installare l'applicazione in questo dispositivo con Eclipse, ottengo questo errore :

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

Non capisco che cosa è sbagliato ... era perfettamente funzionante fino Android 5.0 . So che sto usando C2D_MESSAGE in due righe, permission e uses-permission, ma ho copiato il codice dalla guida originale di Google MCG, quindi deve essere bene .



Top 5 Respuesta

1x-code @

Ho avuto lo stesso problema con un permesso di firma personalizzata su Android - 21 e risolto facendo in modo che stavo facendo una disinstallazione completa .

Questo è un caso limite che si verifica quando :

An application defines a custom permission using signature level security You attempt to update the installed app with a version signed with a different key The test device is running Android 21 or newer with support for multiple users Command line example

Ecco la trascrizione della riga di comando che dimostra il problema e come risolverlo . A questo punto una versione di debug è installato e sto cercando di installare una versione di produzione firmato con la chiave di sblocco :

# This fails because the debug version defines the custom permission signed with a different key:

[[email protected] 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:

[[email protected] 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:

[[email protected] 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:

[[email protected] 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):

[[email protected] svn-android-apps]# /android-sdk-linux/platform-tools/adb uninstall com.example.android.example
Success

# Release version now successfully installs:

[[email protected] 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

[[email protected] svn-android-apps]# 
Eclipse example

Andando nella direzione opposta ( si tenta di installare una build di debug di Eclipse quando una build di rilascio è già installato ), ottengo la seguente finestra di dialogo :

INSTALL_FAILED_DUPLICATE_PERMISSION ... C2D_MESSAGE

Se hai appena risposta affermativa a questo punto l'installazione avrà successo .

Device example

Come sottolineato in un'altra risposta, si può anche andare a una pagina di informazioni app nelle impostazioni del dispositivo, fare clic sul menu di overflow, e selezionare " Disinstalla per tutti gli utenti " per evitare questo errore .



2Preethi Rao @

dando questo errore sarà chiaramente menzionare il nome del pacchetto della app a causa del quale il permesso negato . E proprio di disinstallare l'applicazione non risolverà il problema Per risolvere il problema possiamo fare il passo successivo

1.Go alle impostazioni 2. Vai a app 3. Vai alla lista scaricato app 4.you può vedere l'applicazione disinstallato nell'elenco 5. Fare clic sulla domanda, andare a più opzione 6.click su disinstallazione per tutte le opzioni gli utenti

Problema risolto : D

3Yasir @

In precedenza si diceva che un app con firma diversa si trova sul dispositivo . Quando si installa da IDE sarebbe anche chiedere vuoi disinstallarlo ?

Ma credo che da Android 5.0 hanno cambiato la ragione per la disinstallazione . Non succede se si installa app con la stessa firma

4Giuseppe @

provare a disinstallare l'applicazione con adb :

adb uninstall com.yourpackage
5TacB0sS @

CommonsWare ha ragione, ma a mio parere questo è un ( bug ) buon sistema per dire : " Il apk installato sul dispositivo è firmato con un certificato diverso, allora il nuovo che si sta tentando di installare " .

Questo è probabilmente un nuovo bug in quanto in passato ha usato per chiedere se disinstallare l'applicazione dal dispositivo a causa di certificato errato .

La soluzione così doloroso come può essere sarebbe di disinstallare l'applicazione manualmente .

Anche quello che abbiamo fatto per il bene del team di sviluppo, abbiamo aggiunto il debug di chiavi al nostro repository, e il punto Gradle usarlo in questo modo:

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

    ...

    buildTypes {
        debug {
            signingConfig signingConfigs.debug
        }
    }

    ...
}

E ora quando si passa tra i dispositivi membri del team, tutti usiamo lo stesso certificato di debug, quindi non c'è nessun problema . :)