安装失败,原因是重复权限... C2D_MESSAGE

189

我正在我的应用程序中使用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,即在permissionuses-permission中,但我是从原始的Google GCM指南复制了这段代码,所以它应该没问题。


20
你最初认为是一个不明显的错误(嗯,我也是...),实际上是一项新的安全功能,防止签名不同的两个应用程序声明相同的自定义权限并安装到设备上。 - AZ_
@NullPointerException 你能否接受答案,因为它对许多人有帮助。 - Pratik Butani
24个回答

0
在我的情况下,我收到了以下错误:
安装错误: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
在我的情况下,我使用了一个第三方库(即供应商),该库附带了一个示例应用程序,我已经在我的设备上安装了该示例应用程序。因此,每次我尝试安装实现该库的自己的应用程序时,示例应用程序都会发生冲突。所以,我只需卸载供应商的示例应用程序,然后它就可以正常工作了。

0

我有另一个应用程序使用了一个带有这个权限的插件。 我卸载了使用相同包的其他应用程序,所有东西都正常工作了


0
在我的情况下,我使用了一个AppID构建了我的应用程序,然后想要使用新的AppID构建它,这就是我收到错误信息的时候。
我正在使用Unity与OneSignal和FirebaseCommon Android插件。这些插件本身在其清单文件中包含了以下行:
<uses-permission android:name="${applicationId}.permission.C2D_MESSAGE"/>
<permission
    android:name="${applicationId}.permission.C2D_MESSAGE"
    android:protectionLevel="signature"/>

我通过解压缩他们的.aar文件发现了这个问题,它相当隐蔽。

我使用Unity的Android依赖项解析器解决了这个问题,并进行了完整的强制解析,这样就可以使用我的新AppId更改清单(因为实际权限字符串是使用变量构建的)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接