4

我的Gcm應用程序從GCM爲Android 4和更高版本收到精美消息。但在我的應用程序下面沒有收到消息。GCM在Android 4下不接收消息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?提前致謝。

回答

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

非常感謝,現在的工作!只是爲了好奇,問題是什麼? – Hoper

+1

不客氣!您沒有正確定義接收器的GCM權限和類別。它們都應該匹配您應用的主要軟件包。出於某種原因,這隻會導致舊版Android版本出現問題。 – Eran