GCM不会在Android 4下面收到消息

时间:2013-11-25 18:15:52

标签: android android-intent broadcastreceiver google-cloud-messaging google-play-services

我的Gcm应用程序收到来自GCM for Android 4及更高版本的精彩信息。但是在我的应用程序下面没有收到消息。

这是GcmBroadcastReceiver:

public class GcmBroadcastReceiver extends WakefulBroadcastReceiver 
{

    @Override
    public void onReceive(Context context, Intent intent) 
        {
            // TODO Auto-generated method stub

            ComponentName comp = new ComponentName(context.getPackageName(), GCMIntentService.class.getName());
            Log.i("GCM BROADCAST", "Begin Broadcast");

            startWakefulService(context, intent.setComponent(comp));

            setResultCode(Activity.RESULT_OK);
        }
}

这是意图:

public class GCMIntentService extends IntentService 
{
    public static final String TAG = "GcmIntentService";
    public static final int NOTIFICATION_ID = 1;

    public GCMIntentService()
        {
            super(Constant.SENDER_ID);
        }

/* (non-Javadoc)
 * @see android.app.IntentService#onHandleIntent(android.content.Intent)
 */
@Override
protected void onHandleIntent(Intent intent)
    {
        // TODO Auto-generated method stub

        Bundle extras = intent.getExtras();

        // Prendo l'istanza di Google Cloud Messaging
        GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this);

        // Prendo la stringa che mi indica il tipo di messaggio
        String messageType = gcm.getMessageType(intent);

        Log.i( TAG , "Messaggio ricevuto: " + extras.toString());

        if(!extras.isEmpty())
            {   
                // Azione nel caso il messaggio sia di errore
                if(GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR.equals(messageType))
                    sendNotification("Send error: " + extras.toString());
                // Azione nel caso il messaggio sia riguardo l'eliminazione sul server
                else if(GoogleCloudMessaging.MESSAGE_TYPE_DELETED.equals(messageType))
                    sendNotification("Deleted messages on server: " + extras.toString());
                // Azione nel caso sia un messaggio rigardante la nostra applicazione
                else if(GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType))
                    {
                        sendNotification(extras.getString("message"));
                    }
            }

        GcmBroadcastReceiver.completeWakefulIntent(intent);
    }

这是清单:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.gcmclient"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="18" />

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

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

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

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.example.gcmclient.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <receiver
        android:name="com.example.gcmclient.GcmBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <category android:name="com.example.gcmclient.broadcastreceivers" />
        </intent-filter>
    </receiver>
    <service android:name="com.example.gcmclient.GCMIntentService" />
    <service android:name="com.example.gcmclient.RegistrationService"></service>
    <receiver 
       android:name="com.example.gcmclient.broadcastreceivers.BootHandler"
       android:enabled="true"
       android:exported="false">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>

</application>

我无法理解为什么它不能在Android 4下运行?提前谢谢。

1 个答案:

答案 0 :(得分:7)

更改

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

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

<receiver
    android:name="com.example.gcmclient.GcmBroadcastReceiver"
    android:permission="com.google.android.c2dm.permission.SEND" >
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        <category android:name="com.example.gcmclient.broadcastreceivers" />
    </intent-filter>
</receiver>

<receiver
        android:name="com.example.gcmclient.GcmBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <category android:name="com.example.gcmclient" />
        </intent-filter>
    </receiver>