SecurityException:未经Android 5许可,不允许启动服务Intent REGISTER

时间:2015-01-20 12:44:55

标签: google-cloud-messaging android-5.0-lollipop securityexception

将我的设备更新为Android 5后,启动我的应用时出现以下异常:

 Caused by: java.lang.SecurityException: Not allowed to start service Intent { act=com.google.android.c2dm.intent.REGISTER pkg=com.google.android.gms (has extras) } without permission com.google.android.c2dm.permission.RECEIVE

我的清单看起来应该是正确的:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="custom.package"
android:versionCode="7"
android:versionName="1.5.0">

<!-- GCM requires a Google account. -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<!-- Keeps the processor from sleeping when a message is received. -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<permission android:name="custom.package.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="custom.package.permission.C2D_MESSAGE" />

<!-- This app has permission to register with GCM and receive message -->
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="com.google.android.c2dm.permission.SEND" />

<application
    ...

    <receiver
        android:name=".GcmBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
            <category android:name="custom.package" />
        </intent-filter>
    </receiver>
    <service android:name=".GcmIntentService" />

我错过了什么?在Android&lt; = 4上,一切都按预期工作。

2 个答案:

答案 0 :(得分:1)

您是否在您的清单中添加了<service>标记?

尝试比较以下AndroidManifest.xml以查看哪里出错:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="custom.package"
    android:versionCode="7"
    android:versionName="1.5.0">

    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="app.cloudstringers.permission.C2D_MESSAGE" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />

    <permission
        android:name="app.cloudstringers.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
    <activity
        android:name="app.cloudstringers.Cloudstringers"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity android:name="ui.fragment.RegisterWithAccountsFragment" />

    <meta-data android:name="com.google.android.gms.version"
               android:value="@integer/google_play_services_version" />

    <!-- Receiver GCM -->
    <receiver
        android:name="app.cloudstringers.GcmBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <category android:name="app.cloudstringers" />
        </intent-filter>
    </receiver>

    <!-- Service GCM -->
    <service
        android:exported="true"
        android:name="app.cloudstringers.GcmIntentService" />
    </application>
</manifest>

答案 1 :(得分:0)

设计改变了Lollipop。

请参阅change

  

Android 5.0包含行为更改,以确保只有一个应用可以定义给定的自定义权限,除非使用与定义权限的其他应用相同的密钥进行签名。