1

私は私のアプリでは、以下のスナップのように通知を表示する:GCMプッシュ通知のカスタムUIを表示するにはどうすればよいですか?

Push Notification

私はすでにthis質問とthis Githubの問題を経験してきました。メッセージのペイロードとしてデータをGCMサーバーに送信する必要があり、ユーザーが通知をクリックしたときにインテントでこのデータにアクセスできます。

私が送信していたメッセージは次のとおりです。

メッセージが正常に受信された
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; 
    } 
} 

、通知が表示されますが、私が望んでいない、まさに:

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

これはGCM・リスナー・サービスの私のコードですonMessageReceived()が呼び出されていないためです。ユーザーがアクティビティでGCMから送信された既定の通知をクリックした場合にのみ、キーと値のペアとして渡すデータを取得できます。私はカスタム通知を表示する多くのアプリを見てきました。したがって、この種の通知を実装するには何らかの方法が必要ですか?どんな助けもありがとうございます。

+0

を読むことによって、独自の通知を作成することができますビルダーを超えた何かをしたい場合は、これらの[リンク1](http://stackoverflow.com/questions/12803557/display-alert-when-push-arrives )と[link2](http://stackoverflow.com/questions/18307967/to-show-push-notification-content-into-the-alert-dialog-when-application-is-eith)を参照してください。これらはお手数です – Masum

+0

ありがとうございます。まあ、私は警告をポップアップしたくありません。通知領域にのみカスタム通知が必要です。どちらのリンクも、通知が到着したときに警告をポップアップする方法を説明しています。 – brainbreaker

答えて

4

ペイロードにnotificationタグがあるため、onMessageReceivedが呼び出されません。

通知を必要とする場合は、通知を削除し、ペイロードにデータを送信する必要があります。そうすると、onMessageReceivedが呼び出され、Notification.Builderクラスを使用して独自の通知を作成する必要があります。

あなたがフォロー​​3210

関連する問題