INSTALL_FAILED_DUPLICATE_PERMISSION... C2D_MESSAGE

Я использую уведомления Google в своем приложении, и до сих пор я сделал это в манифесте ниже:

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

Он отлично работал, пока я не обновил свой Nexus 7 до Android 5.0.
Теперь, когда я пытаюсь установить приложение в этом устройстве с помощью Eclipse, я получаю эту ошибку:

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

Я не понимаю, что не так... он отлично работал до Android 5.0.
Я знаю, что я использую C2D_MESSAGE в двух строках, permission и uses-permission, но я скопировал этот код из оригинального руководства Google GCM, поэтому все должно быть хорошо.

Ответ 1

Я нашел решение, которое работает для меня.

В моем устройстве (Nexus 7) Android 5.0. Lollipop Я следую этим шагам.

После удаления приложения Вы найдете App Name в списке приложений вкладки Downloaded.

  • Перейдите в Настройки
  • Приложения
  • Внизу списка вы найдете YourApp с тегом "NOT INSTALLED"
  • Открыть
  • Нажмите OptionMenu и выберите "Удалить для всех пользователей"

После этого процесса я успешно устанавливаю новое приложение, и оно работает хорошо.

Ответ 2

Удалите

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

Запустить приложение... Затем добавьте permisson снова и запустите приложение.

Готов!.

Ответ 3

У меня была та же проблема с пользовательским разрешением подписи на Android-21 и решила его, убедившись, что я делаю полную деинсталляцию.

Это краевой регистр, который возникает, когда:

  • Приложение определяет настраиваемое разрешение с использованием безопасности уровня подписей
  • Вы пытаетесь обновить установленное приложение версией, подписанной другим ключом.
  • На тестовом устройстве работает Android 21 или новее с поддержкой нескольких пользователей.

Пример командной строки

Вот сценарий командной строки, который демонстрирует проблему и как ее решить. На этом этапе установлена ​​версия отладки, и я пытаюсь установить производственную версию, подписанную с ключом выпуска:

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

Идти в обратном направлении (пытаясь установить сборку отладки из Eclipse, когда сборка релиза уже установлена), я получаю следующий диалог:

Eclipse reinstall dialog

Если вы просто ответите "да" в этот момент, установка будет успешной.

Пример устройства

Как указано в другом ответе, вы также можете перейти на страницу сведений о приложении в настройках устройства, щелкнуть меню переполнения и выбрать "Удалить для всех пользователей", чтобы предотвратить эту ошибку.

Ответ 4

Я решил это, не прибегая к деинсталляции альтернативного apk (что боль, правда?). Чтобы успешно установить как отладочную версию, так и версию apk, просто используйте gradle встроенный заполнитель ${applicationId} в AndroidManifest.xml, чтобы изменить значения имени android: name во время компиляции.

Фрагмент файла build.gradle:

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

Фрагмент файла AndroidStudio.xml:

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

Вы можете проверить измененный файл AndroidManifest.xml в apk с помощью aapt l -a app-debug.apk, чтобы убедиться, что местозаполнитель был правильно применен. Если вы используете различные вкусы продукта, я уверен, что вы можете применить вариант этого метода в соответствии с вашими потребностями.

Ответ 5

Удалите с вашего файла манифеста любую "жестко закодированную" ссылку вашего имени пакета.

(Это лучшая практика, даже если вы не используете productFlavors)

Например, если ваш манифест содержит:

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

Изменено:

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

Затем в вашем файле gradle установите соответствующий 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
    }
}

Вы можете следовать этому руководству для получения дополнительной информации

Ответ 6

При предоставлении этой ошибки будет ясно указано имя пакета приложения, из-за которого было отказано в разрешении. И просто удаление приложения не решит проблему. Чтобы решить проблему, нам нужно сделать следующий шаг:

  • Перейти к настройкам
  • Перейти в приложение
  • Перейдите в список загруженных приложений
  • Вы можете увидеть удаленное приложение в списке
  • Нажмите на приложение, перейдите к дополнительной опции
  • Нажмите "Удалить" для всех параметров пользователя.

Задача решена: D

Ответ 7

попробуйте удалить приложение с помощью adb:

adb uninstall com.yourpackage

Ответ 8

Установка приложения в OS 5.0 я получаю это сообщение:

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

Нет дублированных пакетов, и мы можем решить эту проблему, удалив вручную старое приложение или используя adb:

adb uninstall com.yourpackage

Ответ 9

CommonsWare прав, но, на мой взгляд, это (ошибка) плохой способ сказать: "Установленный на устройстве apk подписан другим сертификатом, а затем новым, который вы пытаетесь установить".

Это, вероятно, новая ошибка, поскольку в прошлом она задавала вопрос о необходимости удаления приложения с устройства из-за неправильного сертификата.

Решение настолько болезненным, насколько это возможно, было бы удалить его вручную.

Кроме того, что мы сделали для разработки команды, мы добавили хранилище отладки в наш репозиторий и назовем gradle следующим образом:

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

    ...

    buildTypes {
        debug {
            signingConfig signingConfigs.debug
        }
    }

    ...
}

И теперь, когда вы передаете устройства между членами команды, мы все используем один и тот же сертификат отладки, поэтому проблем нет.:)

Ответ 10

В Android 5 проверьте свои настройки → приложения. Вместо того, чтобы удалять только активного пользователя (так как у android 5 может быть несколько пользователей, а мой телефон - гостевым пользователем), нажмите на кнопку аксессуара в правом верхнем углу панели действий/панели инструментов и выберите "удалить для всех пользователей". Похоже, что в Android 5, когда вы просто удаляете из пусковой установки, вы удаляете приложение только для активного пользователя.

Приложение все еще находится на устройстве. Это меня поразило, так как я пытался установить версию релиза, не работал, поэтому я думал, что должно быть так, потому что у меня все еще есть версия отладки, Но, чем все еще не удалось установить.. Первая подсказка была записью в списке приложений удаленного приложения с сообщением рядом с ним о том, что оно было удалено (изображение).

Uninstalled app still showing up in appsUninstalled for all users

Ответ 11

Ничто из этого не помогло мне. Мое приложение отлично работало раньше, чем Lollipop. Но когда я протестировал его на Lollipop, возникла ошибка выше. Он отказался установить. У меня не было установленных ранее версий, поэтому все вышеупомянутые решения недействительны в моем случае. Но благодаря этому SO-решению теперь он работает нормально. Как и большинство разработчиков, я следил за Google, вводящим в заблуждение учебник, и я добавил разрешения, скопировав и вставив их вот так:

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

Это будет работать со старыми версиями < Леденец. Итак, теперь я изменил на:

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

Ответ 12

См. ссылку в которой говорится, что она будет работать, когда они будут подписаны одним и тем же ключом. Клавиша release и ключ отладки не совпадают.

Так и сделайте это:

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


}

Ответ 13

Раньше он говорил, что приложение с другой подписью находится на устройстве. При установке из IDE он также спросит, хотите ли вы его удалить?

Но я думаю, что с Android 5.0 они изменили причину деинсталляции. Это не происходит, если вы устанавливаете приложение с той же подписью

Ответ 14

Я столкнулся с той же проблемой с Nexus 5 Android Lollipop 5.0.1:

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

И в моем случае я не мог исправить эту проблему uninstalling, потому что это был android app, но мне пришлось изменить имя моего приложения custom permissions в manifest, потому что они были такими же, как и у Android приложение, которое я не смог удалить или изменить.

Надеюсь, это поможет кому-то!

Ответ 15

В моем случае я получил следующую ошибку

Ошибка установки: INSTALL_FAILED_DUPLICATE_PERMISSION perm = com.map.permission.MAPS_RECEIVE pkg = com.abc.Firstapp

Когда я пытался установить приложение с именем пакета com.abc.Secondapp. Здесь было указано, что приложение с именем пакета com.abc.Firstapp уже установлено в моем приложении.

Я решил эту ошибку, удалив приложение с именем пакета com.abc.Firstapp, а затем установив приложение с именем пакета com.abc.Secondapp

Я надеюсь, что это поможет кому-то во время тестирования.

Ответ 16

В вашем файле AndroidManifest.xml измените свои специально объявленные имена разрешений, например:

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

<!-- 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 эта часть решает конфликт с другим вашим приложением.

Ответ 17

В моем случае я использовал стороннюю библиотеку (например, вендор), а в библиотеке есть пример приложения, которое я уже установил на своем устройстве. Так что приложение-образец теперь конфликтует каждый раз, когда я пытаюсь установить собственное приложение, реализующее библиотеку. Поэтому я просто удалил приложение-образец поставщика, и он работает позже.

Ответ 18

заменить ниже строки:

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

Ответ 19

Я удалил предыдущую версию. Это сработало для меня.

Ответ 20

Я перезапустил свой телефон после удаления приложения, и он работал