10

Ich habe Parse Push-Benachrichtigungen implementiert, aber es gibt ein Problem auf der Android Seite für mich. Jedes Mal, wenn ich eine Benachrichtigung von Parse sende, erhalten alle Android-Geräte zwei Benachrichtigungen, eine mit dem Text, den ich gesendet habe und der andere mit leerem Text.Extra-Push-Benachrichtigung auf Android-Gerät gesendet

Bitte legen nahe, was hier falsch

Hinweis sein könnte: Ich habe auch die native Android-Benachrichtigungen (GCM Benachrichtigungen) zu meinem Projekt hinzugefügt. Ist es möglich, dass sie dieses Problem verursachen?

Danke.

Die AndroidManifest ist wie folgt aufgebaut:

<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
<uses-permission android:name="com.android.vending.BILLING" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 

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


<application 
    android:name=".activityApplication" 
    android:label="@string/app_name" 
    android:icon="@drawable/icon"> 

    <activity android:name=".activity" 
       android:label="@string/app_name" 
       android:screenOrientation="landscape" 
       android:theme="@android:style/Theme.NoTitleBar.Fullscreen" 
       android:configChanges="orientation"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity android:name="com.google.android.gms.ads.AdActivity" 
    android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/> 


    <!-- gcm --> 
    <receiver 
     android:name="com.company.activity.GCBroadcastReceiver" 
     android:exported="true" 
     android:process=":remote" 
     android:permission="com.google.android.c2dm.permission.SEND" > 
     <intent-filter> 
      <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 

      <category android:name="com.company.activity" /> 
     </intent-filter> 
    </receiver> 

    <service android:name=".GcmIntentService" /> 
    <service android:name="com.parse.PushService" /> 
    <receiver android:name="com.parse.ParseBroadcastReceiver"> 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
      <action android:name="android.intent.action.USER_PRESENT" /> 
     </intent-filter> 
    </receiver> 
    <receiver android:name="com.parse.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.company.activity" /> 
     </intent-filter> 
    </receiver> 


</application> 

Und das ist meine Sendung Empfänger:

public class GCBroadcastReceiver extends BroadcastReceiver 
{ 
    private static final String TAG = "GCBroadcastReceiver"; 
    Context ctx; 

    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     ctx = context; 

     // Local notification. 
      Bundle bundle = intent.getExtras(); 
     String message = bundle.getString("message"); 
       String notificationID = bundle.getString("notificationID"); 

     Log.v(TAG,"Notification message : " + message + "With ID : " + notificationID); 

     sendNotification(message, notificationID); 
    } 

    // Put the GCM message into a notification and post it. 
    private void sendNotification(final String message, final String notificationID) 
    { 

     Intent notificationIntent = new Intent(ctx, Activity.class); 
     PendingIntent intent = PendingIntent.getActivity(ctx, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); 


     NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(ctx); 

     mBuilder.setContentIntent(intent); 
     mBuilder.setStyle(new NotificationCompat.BigTextStyle().bigText(message)); 
     mBuilder.setWhen(System.currentTimeMillis()); 
     mBuilder.setSmallIcon(R.drawable.icon); 
     mBuilder.setContentTitle(ctx.getString(R.string.app_name)); 
     mBuilder.setContentText(message); 
     mBuilder.setLights(Color.RED, 400, 400); 
     mBuilder.setAutoCancel(true); 
     //mBuilder.setSound(Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + ctx.getPackageName() + "/raw/" + sound)); 
     mBuilder.setDefaults(Notification.DEFAULT_LIGHTS | Notification.DEFAULT_VIBRATE); 

     NotificationManager mNotificationManager = (NotificationManager) ctx 
      .getSystemService(Context.NOTIFICATION_SERVICE); 
     mNotificationManager.notify(0, mBuilder.build()); 
    } 
} 

Antwort

7

Parse verwendet GCM, also, wenn Sie eine Benachrichtigung an eine Anwendung sendet, verwendet Parse und zusätzlich behandeln Sie die GCM-Nachricht mit nativem Android-Code, der eine Benachrichtigung anzeigt, die Benachrichtigung kann zweimal behandelt werden (einmal durch Ihren Code und einmal durch Parse), w Dies wird dazu führen, dass es zweimal angezeigt wird.

Warum eine der Benachrichtigungen leeren Text hat - der Code, der sie anzeigt, erwartet wahrscheinlich, dass sich der Text in einem zusätzlichen Parameter befindet, der nicht vom Server gesendet wurde und daher kein Text angezeigt werden konnte.

UPDATE:

Nun, da ich Sie Code zu sehen, kann ich hinzufügen, die folgenden:

Sie haben zwei Rundfunkempfängern, die eingehenden GCM-Nachrichten verarbeiten - com.parse.GcmBroadcastReceiver und com.company.activity.GCBroadcastReceiver. Beide versuchen, die Benachrichtigungen zu verarbeiten, die von Parse an Ihr Gerät gesendet werden (von Ihrem Kommentar unten verstehe ich, dass das Problem nicht auftritt, wenn Sie Ihre "lokalen" Benachrichtigungen senden).

Ich gehe davon aus, dass die Parse-Bibliothek Register auf eigene GCM. Wenn Sie eine andere Sender-ID (API Projekt-ID) für die Parse-Anmeldung und für Ihre Mutter GCM Registrierung verwenden, können Sie Ihr Problem zu beheben, indem intent.getExtras().get("from") in Ihrem onReceive Verfahren zu überprüfen. Wenn es die Absender-ID Ihrer lokalen Benachrichtigungen nicht enthält, rufen Sie nicht sendNotification(message, notificationID);, und die zweite Benachrichtigung mit dem leeren Text wird nicht angezeigt.

public void onReceive(Context context, Intent intent) 
{ 
    ctx = context; 

    // Local notification. 
     Bundle bundle = intent.getExtras(); 
    String message = bundle.getString("message"); 
      String notificationID = bundle.getString("notificationID"); 

    Log.v(TAG,"Notification message : " + message + "With ID : " + notificationID); 

    if (intent.getExtras().get("from").equals (YOUR_SENDER_ID_FOR_LOCAL_NOTIFICATIONS)) 
     sendNotification(message, notificationID); 
} 

Nun, wenn Sie die gleiche Absender-ID für beide Arten von Benachrichtigungen verwenden, können Sie entweder starten verschiedene Sender-IDs verwenden, oder Sie können einen anderen Zustand verwenden - überprüfen, ob intent.getExtras().get("message") einen Wert hat. Ihre lokalen Benachrichtigungen erfordern diesen Parameter, und ich nehme an, dass die Parse-Benachrichtigungen dies nicht tun (was die Benachrichtigungen ohne Text erklärt, die Sie sehen).

Mit zwei GCM-Rundfunkempfänger kann auch andere Probleme verursachen, so empfehle ich Ihnen bei this question zur weiteren Lektüre suchen.

+0

Dank Eran, das war das Problem. Die OnReceive Methode meiner BroadcastReceiver wird auch aufgerufen, wenn eine Parse-Benachrichtigung ausgelöst wird, und ich bekomme dieses Protokoll „GCBroadcastReceiver (21137): Benachrichtigung Nachricht: null, mit ID: null“ und dies führt zu einer zusätzlichen leeren Benachrichtigung. Grundsätzlich habe ich GCM hinzugefügt, um lokale Benachrichtigungen neben Parse-Push-Benachrichtigungen zu implementieren.Lokale Benachrichtigungen funktionieren perfekt für mich, aber ich bekomme das oben erwähnte Problem mit Push-Benachrichtigungen. Können Sie eine Lösung dafür vorschlagen? – EvG9

+0

@ EvG9 Ich könnte etwas vorschlagen, wenn ich Ihren Code sehe (Manifest- und Broadcast-Empfänger). – Eran

+0

Ich habe meinen ursprünglichen Beitrag mit dem Manifest und Rundfunkempfänger – EvG9

Verwandte Themen