Ich verwende Google-Benachrichtigungen in meiner App, und bis jetzt habe ich unten im Manifest Folgendes ausgeführt:
<!-- 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 -->
Es hat perfekt funktioniert, bis ich mein Nexus 7 auf Android 5.0 aktualisiert habe.
Wenn ich jetzt versuche, die App auf diesem Gerät mit Eclipse zu installieren, erhalte ich diesen Fehler:
INSTALL_FAILED_DUPLICATE_PERMISSION perm = com.myapp.permission.C2D_MESSAGE pkg = com.myapp
Ich verstehe nicht was falsch ist ... bis Android 5.0 funktionierte es einwandfrei.
Ich weiß, dass ich C2D_MESSAGE
in zwei Zeilen verwende, permission
und uses-permission
, aber ich habe diesen Code aus dem ursprünglichen Google GCM-Handbuch kopiert, es muss also in Ordnung sein.
Ich habe eine Lösung gefunden, die für mich funktioniert.
In meinem Gerät (Nexus 7) Android 5.0. Lutscher Ich folge diesen Schritten.
Nach der Deinstallation der App Sie finden App Name
unter der Liste der Apps auf der Registerkarte Downloaded
.
YourApp
mit einem "NOT INSTALLED" -Tag OptionMenu
und wählen Sie "Für alle Benutzer deinstallieren" Nach diesem Vorgang installiere ich die neue App erfolgreich und sie läuft gut.
Löschen
<uses-permission Android:name="${applicationId}.permission.C2D_MESSAGE"/>
<permission
Android:name="${applicationId}.permission.C2D_MESSAGE"
Android:protectionLevel="signature"/>
App ausführen ....___. Fügen Sie dann die Berechtigung erneut hinzu und führen Sie die App aus.
Bereit!.
Ich hatte das gleiche Problem mit einer benutzerdefinierten Signaturerlaubnis für Android-21 und löste es, indem ich mich vergewisserte, dass ich eine vollständige Deinstallation durchführte.
Dies ist ein Edge-Fall, der auftritt, wenn:
Hier ist ein Befehlszeilentranskript, das das Problem und seine Lösung veranschaulicht. An diesem Punkt ist eine Debug-Version installiert und ich versuche, eine mit dem Freigabeschlüssel signierte Produktionsversion zu installieren:
# 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]#
In umgekehrter Richtung (beim Versuch, einen Debug-Build von Eclipse zu installieren, wenn bereits ein Release-Build installiert ist), wird das folgende Dialogfeld angezeigt:
Wenn Sie an dieser Stelle nur mit Ja antworten, ist die Installation erfolgreich.
Wie in einer anderen Antwort beschrieben, können Sie auch in den Geräteeinstellungen auf eine App-Infoseite gehen, auf das Überlaufmenü klicken und "Für alle Benutzer deinstallieren" auswählen, um diesen Fehler zu vermeiden.
Ich habe dieses Problem gelöst, ohne zuerst die alternative Apk deinstallieren zu müssen (was für ein Schmerz, oder?). Um sowohl eine Debug- als auch eine Release-Version eines apk erfolgreich zu installieren, verwenden Sie einfach den integrierten Platzhalter $ {applicationId} innerhalb von AndroidManifest.xml, um die Android-Werte der Berechtigungen zum Zeitpunkt der Kompilierung zu ändern.
Das build.gradle-Datei-Snippet:
buildTypes {
debug {
applicationIdSuffix ".debug"
...
}
}
Das AndroidStudio.xml-Datei-Snippet:
<uses-permission Android:name="${applicationId}.permission.C2D_MESSAGE"/>
<permission
Android:name="${applicationId}.permission.C2D_MESSAGE"
Android:protectionLevel="signature"/>
Sie können die geänderte AndroidManifest.xml-Datei in der apk mit aapt l -a app-debug.apk
überprüfen, um sicherzustellen, dass der Platzhalter ordnungsgemäß angewendet wurde. Wenn Sie verschiedene Produktvarianten verwenden, können Sie sicher eine Variante dieser Methode anwenden, die Ihren Anforderungen entspricht.
Entfernen Sie einen "hart codierten" Verweis auf Ihren Paketnamen aus Ihrer Manifestdatei.
(Dies ist die beste Methode, auch wenn Sie productFlavors
nicht verwenden.)
Wenn Ihr Manifest beispielsweise Folgendes enthält:
<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"/>
Geändert zu:
<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"/>
Legen Sie dann in Ihrer Modul-Gradlendatei Ihre relevante applicationId
fest:
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
}
}
Sie können diesem Tutorial folgen, um weitere Informationen zu erhalten .
Während dieses Fehlers angegeben wird, wird der Paketname der App eindeutig erwähnt, weshalb die Berechtigung abgelehnt wurde. Durch das Deinstallieren der Anwendung wird das Problem nicht gelöst. Um das Problem zu lösen, müssen wir den folgenden Schritt ausführen:
Problem gelöst: D
versuchen Sie, die App mit Adb zu deinstallieren:
adb uninstall com.yourpackage
Bei der Installation einer Anwendung unter OS 5.0 erhalte ich folgende Meldung:
INSTALL_FAILED_DUPLICATE_PERMISSION perm=com.myapp.permission.C2D_MESSAGE pkg=com.myapp
Es gibt keine duplizierten Pakete, und wir können dieses Problem lösen, indem Sie die alte Anwendung manuell deinstallieren oder die Adb-Datei verwenden:
adb uninstall com.yourpackage
Überprüfen Sie in Android 5 Ihre Einstellungen -> Apps. Anstatt nur für den aktiven Benutzer zu löschen (da Android 5 mehrere Benutzer haben kann und mein Telefon einen Gastbenutzer hat), tippen Sie auf die Schaltfläche "Zubehör" in der rechten oberen Ecke der Aktions-/Symbolleiste und wählen Sie "Für alle Benutzer deinstallieren". Es scheint, als würden Sie in Android 5 die App nur für den aktiven Benutzer deinstallieren, wenn Sie sie einfach vom Starter deinstallieren.
Die App ist immer noch auf dem Gerät. Dies hat mich geblendet, seit ich versuchte, eine Release-Version zu installieren. Ich habe nicht gedacht, dass es richtig sein muss, da ich immer noch die Debug-Version installiert habe. Die App wurde deinstalliert. Aber es konnte immer noch nicht installiert werden. Der erste Hinweis war ein Eintrag in der App-Liste der deinstallierten App mit der Meldung daneben, dass sie deinstalliert wurde (Image).
CommonsWare hat Recht, aber meiner Meinung nach ist dies eine (schlechte) schlechte Art zu sagen: "Die auf dem Gerät installierte apk ist mit einem anderen Zertifikat signiert als das neue, das Sie installieren wollen" .
Dies ist wahrscheinlich ein neuer Fehler, da früher gefragt wurde, ob die App aufgrund eines falschen Zertifikats vom Gerät deinstalliert werden soll.
Die Lösung, so schmerzhaft es auch sein mag, wäre, die App manuell zu deinstallieren.
Außerdem haben wir den Debug-Keystore zu unserem Repository hinzugefügt, und wir haben den Graduierer dazu gebracht, ihn wie folgt zu verwenden:
Android {
...
signingConfigs {
debug {
storeFile file("../certificates/debug.keystore")
}
}
...
buildTypes {
debug {
signingConfig signingConfigs.debug
}
}
...
}
Wenn jetzt Geräte zwischen den Teammitgliedern übergeben werden, verwenden wir dasselbe Debug-Zertifikat, sodass kein Problem besteht. :)
Keines der oben genannten Dinge funktionierte für mich. Meine App funktionierte im Vorfeld besser als Lollipop. Als ich es auf Lollipop testete, kam der obige Fehler auf. Es lehnte die Installation ab. Ich hatte keine Vorversionen installiert, daher sind alle oben genannten Lösungen in meinem Fall ungültig. Aber dank dieser SO -Lösung jetzt läuft es gut. Genau wie die meisten Entwickler folgte ich dem irreführenden Tutorial von Google und fügte die Berechtigungen durch Kopieren und Einfügen wie folgt hinzu:
<uses-permission Android:name="com.google.Android.c2dm.permission.RECEIVE" />
<permission Android:name="com.google.Android.permission.C2D_MESSAGE"
Android:protectionLevel="signature" />
Dies würde mit älteren Versionen <Lollipop funktionieren. Also habe ich mich geändert zu:
<uses-permission Android:name="com.mycompany.myappname.c2dm.permission.RECEIVE" />
<permission Android:name="com.mycompany.myappname.permission.C2D_MESSAGE"
Android:protectionLevel="signature" />
Siehe diesen link sagte, dass es funktionieren wird, wenn sie mit demselben Schlüssel signiert sind. Der Freigabeschlüssel und der Debug-Schlüssel stimmen nicht überein.
Also mach es:
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_"***"
}
}
ersetzen Sie die folgenden Zeilen:
<permission Android:name="com.myapp.permission.C2D_MESSAGE" Android:protectionLevel="signature" />
<uses-permission Android:name="com.myapp.permission.C2D_MESSAGE"
Android:protectionLevel="signature" />
Ich habe das gleiche Problem mit einem nexus 5 Android Lollipop 5.0.1 festgestellt:
Installation error: INSTALL_FAILED_DUPLICATE_PERMISSION perm=com.Android.** pkg=com.Android.**
In meinem Fall konnte ich das Problem uninstalling
der App nicht beheben, da es ein Android app
war. Ich musste jedoch den custom permissions
-Namen in manifest
ändern, da es sich um eine Android-App handelt, die ich nicht deinstallieren kann .
Hoffe das hilft jemandem!
Ich habe die vorherige Version deinstalliert. Es hat für mich funktioniert.
In meinem Fall habe ich eine Drittanbieter-Bibliothek (d. H. Anbieter) verwendet, und die Bibliothek wird mit einer Beispiel-App geliefert, die ich bereits auf meinem Gerät installiert hatte. Bei dieser Beispiel-App gab es jetzt jedes Mal Konflikte, wenn ich versuche, eine eigene App zu installieren, die die Bibliothek implementiert. Also habe ich einfach die Beispiel-App des Herstellers deinstalliert und es funktioniert danach.
In meinem Fall erhielt ich folgenden Fehler
Installationsfehler: INSTALL_FAILED_DUPLICATE_PERMISSION perm = com.map.permission.MAPS_RECEIVE pkg = com.abc.Firstapp
Bei dem Versuch, die App zu installieren, die den Paketnamen com.abc.Secondapp
hat. Hier war der Punkt, dass die App mit dem Paketnamen com.abc.Firstapp
bereits in meiner Anwendung installiert war.
Ich habe diesen Fehler behoben, indem ich die Anwendung mit dem Paketnamen com.abc.Firstapp
deinstallierte und dann die Anwendung mit dem Paketnamen com.abc.Secondapp
installierte.
Ich hoffe, das hilft jemandem beim Testen.
Früher hieß es, dass sich eine App mit einer anderen Signatur auf dem Gerät befindet. Bei der Installation von IDE wird auch gefragt, ob Sie es deinstallieren möchten.
Aber ich denke, ab Android 5.0 haben sie den Grund für die Deinstallation geändert. Dies ist nicht der Fall, wenn Sie eine App mit derselben Signatur installieren
Ändern Sie in Ihrer AndroidManifest.xml-Datei die Namen Ihrer speziell deklarierten Berechtigungen, zum Beispiel:
<!-- 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 -->
dazu
<!-- 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 Dieser Teil löst den Konflikt mit Ihrer anderen App.
Ich habe mein Telefon nach der Deinstallation der App neu gestartet und es hat funktioniert