web-dev-qa-db-ja.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までは完璧に動作していました。
私はpermissionC2D_MESSAGEの2行でuses-permissionを使用していることを知っていますが、そのコードを元のGoogle GCMガイドからコピーしたので、問題ないはずです。

173

私は私のために働く解決策を見つけました。

マイデバイス(Nexus 7)Android 5.0。ロリポップ私はこれらのステップに従います。

アプリのアンインストール後Downloadedタブのアプリ一覧の下にApp Nameがあります。

  • 設定に移動
  • アプリ
  • リストの一番下に、 "NOT INSTALLED"タグが付いたYourAppがあります。
  • 開いた
  • OptionMenuをクリックして「すべてのユーザーのためにアンインストール」を選択します

そのプロセスの後、私は正常に新しいアプリをインストールし、それはうまく動作しています。

削除する

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

アプリを実行してください...それから、再度権限を追加してアプリを実行します。

準備完了!.

134
Delmirio Segura

私は、Android-21のカスタム署名許可に関して同じ問題を抱えており、完全なアンインストールを行っていることを確認することによってそれを解決しました。

これは次の場合に発生するEdgeのケースです。

  1. アプリケーションは、署名レベルのセキュリティを使用してカスタム権限を定義します
  2. インストールされているアプリを別のキーで署名されたバージョンで更新しようとしました
  3. テストデバイスは、Android 21以降を実行しており、複数のユーザーをサポートしています。

コマンドラインの例

これが問題とその解決方法を示すコマンドライントランスクリプトです。この時点でデバッグバージョンがインストールされており、リリースキーで署名された製品バージョンをインストールしようとしています。

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

Eclipseの例

反対方向に進むと(リリースビルドが既にインストールされているときにEclipseからデバッグビルドをインストールしようとすると)、次のようなダイアログが表示されます。

Eclipse reinstall dialog

この時点で「はい」と答えるだけでインストールは成功します。

デバイス例

別の回答で指摘されているように、このエラーを防ぐために、デバイス設定のアプリ情報ページに行き、オーバーフローメニューをクリックし、「すべてのユーザーのためにアンインストール」を選択することもできます。

47
x-code

私は最初に代替APKをアンインストールすることに頼らずにこれを解決しました(何の苦痛、正しいでしょうか?)。 apkのデバッグ版とリリース版の両方を正常にインストールするには、AndroidManifest.xml内でgradleの組み込み$ {applicationId}プレースホルダーを使用して、コンパイル時に権限の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"/>

aapt l -a app-debug.apkを使用してapk内の変更されたAndroidManifest.xmlファイルを調べて、プレースホルダーが正しく適用されたことを確認できます。あなたが様々な製品フレーバーを使用するならば、私はあなたがあなたのニーズに合うようにこの方法の変形を適用することができると確信しています。

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

次に、モジュールの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
    }
}

このチュートリアルに従って詳しい情報を見ることができます

24
David

adbでアプリをアンインストールしてみてください。

adb uninstall com.yourpackage
18
Giuseppe

このエラーを出している間は、許可が拒否されたため、アプリのパッケージ名を明確に記載します。アプリケーションをアンインストールしても問題は解決しません。問題を解決するために、次のステップを実行する必要があります。

  1. 設定に移動
  2. アプリに行きます
  3. ダウンロードしたアプリのリストに行く
  4. あなたはリストにアンインストールされたアプリケーションを見ることができます
  5. アプリケーションをクリックして、その他のオプションに進みます
  6. すべてのユーザーに対してアンインストールをクリックしますオプション

解決した問題:D

17
Preethi Rao

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は正しいですが、私の意見ではこれは(バグ)悪い言い方です: "

証明書が間違っていたためにこれまでデバイスからアプリをアンインストールするかどうかを尋ねていたため、これはおそらく新しいバグです。

それは可能な限り痛みを伴う解決策は手動でそれをアプリをアンインストールすることでしょう。

また、私たちがチーム開発のために行ったことは、私たちのリポジトリにデバッグキーストアを追加し、それを次のように使うことを賛成です:

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

    ...

    buildTypes {
        debug {
            signingConfig signingConfigs.debug
        }
    }

    ...
}

チームメンバー間でデバイスをやり取りするときには、全員が同じデバッグ証明書を使用しているので問題ありません。 :)

4
TacB0sS

上記のどれも私のために働きませんでした。私のアプリはLollipopよりも以前はうまく機能していました。しかし、私がロリポップでそれをテストしたとき、上記のエラーが起こりました。インストールを拒否しました。以前のバージョンがインストールされていないので、上記の解決策はすべて無効です。しかし このSO解決策 のおかげで今ではうまく動いています。ほとんどの開発者と同じように、私はグーグルの誤解を招くチュートリアルに従って、私はこのようにコピー&ペーストによって許可を追加しました:

<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

私はネクサス5のAndroidロリポップ5.0.1と同じ問題が発生しました:

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

私の場合はAndroid appなのでアプリのuninstallingという問題は解決できませんでしたが、manifestのアプリのcustom permissionsの名前は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のアプリケーションをインストールしてください。

私はこれがテスト中に誰かに役立つことを願っています。

以前は、異なるシグネチャを持つアプリがデバイス上で見つかったと言っていました。 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