GCM无法接收低于Android 4的消息

4

我的Gcm应用程序可以接收来自Android 4及以上版本的GCM消息。但是在以下情况下,我的应用程序无法接收到消息。

这是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个回答

7

更改

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

to

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

to

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

非常感谢,现在它正常工作了!只是出于好奇,问题是什么? - paolo2988
1
不客气!您没有正确定义接收器的GCM权限和类别。它们应该与您的应用程序的主包匹配。由于某种原因,这只会在旧版Android中引起问题。 - Eran

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