1

Ich möchte eine Benachrichtigung zeigen, wie in dem Snap unten in meiner App:Wie zeigt man benutzerdefinierte UI für eine GCM-Push-Benachrichtigung?

Push Notification

Ich habe bereits durch this Frage und this Github Frage gegangen. Es besagt, dass Sie Ihre Daten als Payload in der Nachricht an den GCM-Server senden müssen, und Sie können auf diese Daten in der App durch Intent zugreifen, wenn der Benutzer auf die Benachrichtigung klickt. Ich schicke ist

Die Botschaft:

body: {"to":"\/topics\/global","data":{"LOL":"abc","LOL1":"xyz"},"notification":{"icon":"icon","title":"App Notification Title","body":"qwerty","click_action":"notification_click_action","sound":"default"}}

Dies ist mein Code von GCM Listenerdienst:

public class MyGcmListenerService extends GcmListenerService { 

    VolleySingleton mVolleySingleton; 
    ImageLoader mImageLoader; 
    Bitmap bitmap; 

    /** 
    * Called when message is received. 
    * 
    * @param from SenderID of the sender. 
    * @param data Data bundle containing message data as key/value pairs. 
    *    For Set of keys use data.keySet(). 
    */ 
    // [START receive_message] 

    @Override 
    public void onMessageReceived(String from, Bundle data) { 

     Log.e("Message Received: ", from); 

     String title = data.getString("title"); 
     System.out.println("Title "+ data.toString()); 
     String subTitle = data.getString("subTitle"); 
     String expandTitle = data.getString("expandTitle"); 
     String imageUrl = data.getString("imageUrl"); 
     String action = data.getString("action"); 
     String offerAction = data.getString("offerAction"); 
     String offerImageUrl = data.getString("offerImageUrl"); 
     System.out.println(bundleToString(data)); 

     sendNotification(data); 
    } 

    @Override 
    public void onDeletedMessages() { 
//  sendNotification("Deleted messages on server"); 
    } 

    @Override 
    public void onMessageSent(String msgId) { 
//  sendNotification("Upstream message sent. Id=" + msgId); 
    } 

    @Override 
    public void onSendError(String msgId, String error) { 
//  sendNotification("Upstream message send error. Id=" + msgId + ", error" + error); 
    } 

    private void sendNotification(final Bundle data) { 

     if(data.getString("imageUrl") == null){ 
      sendNotification(data,null); 
     } else { 
      mVolleySingleton = VolleySingleton.getInstance(); 

      Handler uiHandler = new Handler(Looper.getMainLooper()); 
      uiHandler.post(new Runnable() { 
       @Override 
       public void run() { 
        mImageLoader = mVolleySingleton.getImageLoader(); 
        mImageLoader.get(data.getString("imageUrl"), new ImageLoader.ImageListener() { 
         @Override 
         public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) { 

          if (response.getBitmap() != null) { 
           bitmap = response.getBitmap(); 
           sendNotification(data, bitmap); 
          } 
         } 

         @Override 
         public void onErrorResponse(VolleyError error) { 
          bitmap = null;/*BitmapFactory.decodeResource(getApplicationContext().getResources(), 
          R.mipmap.logo);*/ 
         } 
        }); 
       } 
      }); 

     } 
    } 

    private void sendNotification(Bundle data,Bitmap bitmap){ 

     String title = data.getString("title"); 
     String subTitle = data.getString("subTitle"); 
     String expandTitle = data.getString("expandTitle"); 
     String imageUrl = data.getString("imageUrl"); 
     String action = data.getString("action"); 
     String offerAction = data.getString("offerAction"); 
     String offerImageUrl = data.getString("offerImageUrl"); 
     long defaultId = Long.parseLong(data.getString("Id")); 
     long defaulttitleId = Long.parseLong(data.getString("titleId")); 
     long defaultTagId = Long.parseLong(data.getString("tagId")); 

     Log.d("Test321", "in MyGcmListenerService Id = " + defaultId + " PtitleId = " + 
       defaulttitleId + " TagId = " + defaultTagId); 

     int smallIconDrawable; 
     if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){ 
      smallIconDrawable = R.mipmap.logo; 
     } else { 
      smallIconDrawable = R.mipmap.logo; 
     } 
     Intent intent; 
     Bundle bundle = new Bundle(); 

     if(defaultId != 0 && defaulttitleId != 0){ 
      Log.d("Test123","Push to 2page"); 
      intent = new Intent(this, DetailActivity.class); 
      bundle.putLong(KEY_ID,defaultId); 
      bundle.putLong(KEY_TITLE_ID, defaulttitleId); 
      bundle.putLong(KEY_TAGID, defaultTagId); 
      bundle.putLong("pushnotification",1); 
      intent.putExtras(bundle); 
     } else { 
      Log.d("Test123","push to mainactivity"); 
      intent = new Intent(this, MainActivity.class); 
     } 
     intent.putExtra("pushnotification",action); 
     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent, 
       PendingIntent.FLAG_ONE_SHOT); 
     Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
     NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) 
       .setSmallIcon(smallIconDrawable) 
       .setLargeIcon(BitmapFactory.decodeResource(getApplication().getResources(),R.mipmap.logo)) 
       .setContentTitle(title) 
       .setContentText(subTitle) 
       .setAutoCancel(true) 
       .setSound(defaultSoundUri) 
       .setContentIntent(pendingIntent); 
     if(bitmap != null){ 
      notificationBuilder.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(bitmap)); 
     }else{ 
      notificationBuilder.setStyle(new NotificationCompat.BigTextStyle().bigText(expandTitle)); 
     } 
     NotificationManager notificationManager = 
       (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 

     notificationManager.notify(0 /* ID of notification */, notificationBuilder.build()); 

    } 

    public static String bundleToString(Bundle bundle) { 
     if (bundle == null) { 
      return null; 
     } 
     String string = "Bundle{"; 
     for (String key : bundle.keySet()) { 
      string += " " + key + " => " + bundle.get(key) + ";"; 
     } 
     string += " }Bundle"; 
     return string; 
    } 
} 

Die Meldung erfolgreich empfangen wird, Benachrichtigung angezeigt wird, aber nicht genau das, was ich wollte wie der onMessageReceived() nicht aufgerufen wird. Ich kann die Daten, die ich als Schlüssel/Wert-Paare übergebe, nur dann erhalten, wenn der Benutzer auf die Standardbenachrichtigung klickt, die von GCM in meiner Aktivität gesendet wurde. Ich habe viele Apps gesehen, die eine benutzerdefinierte Benachrichtigung anzeigen. Also muss es eine Möglichkeit geben, diese Art von Benachrichtigung zu implementieren? Jede Hilfe wird geschätzt.

+0

Folgen diese [link1] Lesen (http://stackoverflow.com/questions/12803557/display-alert-when-push-arrives) und [link2] (http://stackoverflow.com/questions/18307967/to-show-push-notification-content-into-the-alert-dialog-when-application-is-eith). Diese helfen Ihnen – Masum

+0

Danke für diese. Nun, ich möchte keinen Alarm auslösen. Ich möchte die benutzerdefinierte Benachrichtigung nur im Benachrichtigungsbereich. Beide Links beschreiben, wie eine Warnmeldung beim Eintreffen einer Benachrichtigung ausgegeben wird. – brainbreaker

Antwort

4

onMessageReceived wird nicht aufgerufen, da das Tag notification in Ihrer Nutzlast enthalten ist.

Wenn Sie eine eigene Benachrichtigung haben möchten, müssen Sie diese entfernen und nur Daten in Ihre Payload senden. Wenn Sie das tun, wird Ihr onMessageReceived aufgerufen und Sie müssen dann Ihre eigene Benachrichtigung mit der Klasse Notification.Builder erstellen.

Wenn Sie etwas über den Erbauer möchten Sie Ihre eigene Mitteilung schaffen können this

Verwandte Themen