0

我在項目中使用新的GoogleCloudMessaging API(來自Play Services庫,因爲舊的Google雲消息傳遞已棄用),並且我有一些錯誤。當我從我的服務器發送消息到所有註冊的設備時,我的nexus 4(android 4.4)收到通知消息,但是我的Samsung Galaxy Ace沒有收到它們,這很奇怪,因爲我的項目沒有例外或崩潰。不會在android 2.2上使用GoogleCloudMessaging收到通知

任何想法? 謝謝。

的Manifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest package="ru.test" 
    android:installLocation="preferExternal" 
    android:versionCode="1" 
    android:versionName="1.0" xmlns:android="http://schemas.android.com/apk/res/android"> 

    <uses-sdk 
     android:minSdkVersion="7" 
     android:targetSdkVersion="17" /> 

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

    <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="android.permission.VIBRATE"/> 
    <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" /> 

    <uses-permission android:name="android.permission.INTERNET"/> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/MyTheme" > 

     <service android:name=".GcmIntentService" /> 

     <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="com.example.gcm" /> 
       </intent-filter> 
     </receiver> 

     <activity 
      android:name="ru.test.MainActivity" 
      android:label="@string/app_name" 
      android:configChanges="orientation|screenSize"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

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

    </application> 

</manifest> 

GcmBroadcastReceiver.java

public class GcmBroadcastReceiver extends WakefulBroadcastReceiver { 

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


     String regId = intent.getExtras().getString("registration_id"); 
      if(regId != null && !regId.equals("")) { 
       /* Do what ever you want with the regId eg. send it to your server */ 

       Log.d(MainActivity.tag, "onReceive " + regId); 
      } 

     // Explicitly specify that GcmIntentService will handle the intent. 
     ComponentName comp = new ComponentName(context.getPackageName(), 
       GcmIntentService.class.getName()); 
     // Start the service, keeping the device awake while it is launching. 
     startWakefulService(context, (intent.setComponent(comp))); 
     setResultCode(Activity.RESULT_OK); 

    } 

}

GcmIntentService.java

public class GcmIntentService extends IntentService { 
    public static int NOTIFICATION_ID = 1; 
    private NotificationManager mNotificationManager; 
    NotificationCompat.Builder builder; 
    static final String TAG = "myLogs"; 

    String title = ""; 
    String message = ""; 
    String subtext = ""; 

    public GcmIntentService() { 
     super("GcmIntentService"); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     Bundle extras = intent.getExtras(); 
     GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this); 
     // The getMessageType() intent parameter must be the intent you received 
     // in your BroadcastReceiver. 
     String messageType = gcm.getMessageType(intent); 

     if (!extras.isEmpty()) { // has effect of unparcelling Bundle 

      title = extras.getString("title"); 
      message = extras.getString("message"); 
      subtext = extras.getString("subtext"); 


      /* 
      * Filter messages based on message type. Since it is likely that GCM 
      * will be extended in the future with new message types, just ignore 
      * any message types you're not interested in, or that you don't 
      * recognize. 
      */ 
      if (GoogleCloudMessaging. 
        MESSAGE_TYPE_SEND_ERROR.equals(messageType)) { 
       message = "Send error"; 
       sendNotification(title, message, subtext); 
      } else if (GoogleCloudMessaging. 
        MESSAGE_TYPE_DELETED.equals(messageType)) {    
       message = "Deleted messages on server"; 
       sendNotification(title, message, subtext); 
      // If it's a regular GCM message, do some work. 
      } else if (GoogleCloudMessaging. 
        MESSAGE_TYPE_MESSAGE.equals(messageType)) { 

       // Post notification of received message. 
       sendNotification(title, message, subtext); 
       Log.d(TAG, "Received: " + extras.toString()); 
      } 
     } 
     // Release the wake lock provided by the WakefulBroadcastReceiver. 
     GcmBroadcastReceiver.completeWakefulIntent(intent); 
    } 

    // Put the message into a notification and post it. 
    // This is just one simple example of what you might choose to do with 
    // a GCM message. 
    private void sendNotification(String title, String message, String subtext) { 



     mNotificationManager = (NotificationManager) 
       this.getSystemService(Context.NOTIFICATION_SERVICE); 

     PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, SplashScreen.class), 0); 

     NotificationCompat.BigTextStyle bigxtstyle = 
       new NotificationCompat.BigTextStyle();   
       bigxtstyle.bigText(message);    

     NotificationCompat.Builder mBuilder = 
       new NotificationCompat.Builder(this) 
       .setSmallIcon(R.drawable.ic_small) 
       .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_large)) 
       .setTicker(message) 
       .setContentTitle(title) 
       .setDefaults(Notification.DEFAULT_ALL | Notification.FLAG_AUTO_CANCEL) 
       //.setContentInfo("Content info") 
       .setAutoCancel(true) 
       .setSubText(subtext) 
       .setWhen(System.currentTimeMillis()) 
       .setStyle(new NotificationCompat.BigTextStyle().bigText(message)) 
       .setContentText(message); 

     mBuilder.setContentIntent(contentIntent); 

     mNotificationManager.notify(++NOTIFICATION_ID, mBuilder.build()); 



    } 
} 
+0

你應該張貼您的清單和客戶代碼,如果你想要一個答案,而不是猜測。 – Eran

+0

謝謝。我已添加 – Denis

回答

2

您的主包名稱爲ru.test,但在GCM權限中指定com.example.gcm作爲包名稱。這就是爲什麼它不能在2.x Android版本中工作(由於某些原因,這種不匹配不會影響4.x版本)。

以下變化將解決你的問題:

<permission android:name="ru.test.permission.C2D_MESSAGE" 
    android:protectionLevel="signature" /> 
<uses-permission android:name="ru.test.permission.C2D_MESSAGE" /> 

    <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="ru.test" /> 
      </intent-filter> 
    </receiver> 

我也建議你從7更改minSdkVersion到8,因爲GCM沒有在API級別支持7

+0

感謝您的回答!現在它工作正常 – Denis

0

你的谷歌播放應用程序在更新Galaxy Ace?可能是這個問題。

另一個假設不會記錄到設備上的任何谷歌帳戶。要在4.0.4之前的版本中接收通知,必須至少在一個方面進行登錄。

+0

是的。與谷歌播放服務一切ok。最新版本。 – Denis

相關問題