it-roy-ru.com

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, поэтому все должно быть в порядке.

167
NullPointerException

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

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

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

  • Перейдите в настройки 
  • Программы 
  • Внизу списка вы найдете YourApp с тегом «НЕ УСТАНОВЛЕНО» 
  • Открыто 
  • Нажмите на OptionMenu и выберите «Удалить для всех пользователей»

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

221
Pratik Butani

Удалить 

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

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

Готовы!.

132
Delmirio Segura

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

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

  1. Приложение определяет пользовательское разрешение, используя уровень безопасности подписи
  2. Вы пытаетесь обновить установленное приложение с версией, подписанной с другим ключом
  3. Тестовое устройство работает под управлением 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'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

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

Eclipse reinstall dialog

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

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

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

47
x-code

Я решил это, не прибегая к удалению альтернативного apk в первую очередь (что за боль, верно?). Чтобы успешно установить как отладочную, так и выпускную версию apk, просто используйте встроенный $ {applicationId} заполнитель gradle в 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, чтобы убедиться, что заполнитель был применен правильно. Если вы используете различные вкусы продукта, я уверен, что вы можете применить вариант этого метода в соответствии с вашими потребностями.

32
Jackpile

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

(Это лучшая практика, даже если вы не используете 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"/>

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

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

23
David

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

  1. Перейдите в настройки 
  2. Перейти к приложению 
  3. Перейти к списку загруженных приложений 
  4. Вы можете увидеть удаленное приложение в списке 
  5. Нажмите на приложение, перейдите к дополнительной опции 
  6. Нажмите на удалить для всех пользователей опции

Проблема решена: D 

17
Preethi Rao

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

adb uninstall com.yourpackage
16
Giuseppe

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

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

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

adb uninstall com.yourpackage

8
Elenasys

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

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

Uninstalled app still showing up in appsUninstalled for all users

4
Jordy

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

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

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

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

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

    ...

    buildTypes {
        debug {
            signingConfig signingConfigs.debug
        }
    }

    ...
}

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

4
TacB0sS

Ничто из вышеперечисленного не помогло мне. Мое приложение работало хорошо в предыдущем, чем 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" />

Это будет работать с более старыми версиями <Lollipop. Так что теперь я изменился на:

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

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

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

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


}
2
NickUnuchek

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

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

Я столкнулся с той же проблемой с 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, которое я не мог удалить или внести какие-либо изменения , 

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

0
Ultimo_m

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

0
Sushil Dhayal

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

0
Nouvel Travay

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

Ошибка установки: 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

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

0
Abhinav Singh Maurya

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

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

0
Yasir

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

0
resw67

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

0
Pedro Martins