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

pao*_*988 4 android broadcastreceiver android-intent 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);
        }
}
Run Code Online (Sandbox Code Playgroud)

这是意图:

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);
    }
Run Code Online (Sandbox Code Playgroud)

这是显而易见的:

<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>
Run Code Online (Sandbox Code Playgroud)

我不明白为什么它不能在Android 4下运行?提前致谢.

Era*_*ran 7

更改

<permission android:name="com.example.gcm.permission.C2D_MESSAGE"
    android:protectionLevel="signature" />
<uses-permission android:name="com.example.gcm.permission.C2D_MESSAGE" />
Run Code Online (Sandbox Code Playgroud)

<permission android:name="com.example.gcmclient.permission.C2D_MESSAGE"
    android:protectionLevel="signature" />
<uses-permission android:name="com.example.gcmclient.permission.C2D_MESSAGE" />
Run Code Online (Sandbox Code Playgroud)

<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>
Run Code Online (Sandbox Code Playgroud)

<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>
Run Code Online (Sandbox Code Playgroud)