15

多信息獲取推送通知的message只在單行,而我是用BigPictureStyle基地(包括通知樣式)期待它在multiple lines火力地堡推送通知 - 如何出現在通知

查看附件截圖,而在此圖片中,我們只顯示"Hello from Firebase Cloud Messaging",所以這適合單線本身。

但事實是,如果我試圖「從火力地堡雲端通訊您好,再次向您問好火力地堡雲通訊」顯示即使在當時我得到的消息在single line only三個點末這樣...

enter image description here

這裏是需要代碼part,我使用:

NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) 
       .setLargeIcon(image)/*Notification icon image*/ 
       .setSmallIcon(R.mipmap.ic_launcher) 
       .setContentTitle(messageTitle) 
       .setContentText(messageBody) 
       .setStyle(new NotificationCompat.BigPictureStyle() 
         .bigPicture(image) 
         .setBigContentTitle(messageTitle) 
         .setSummaryText(Html.fromHtml(messageBody) 
         .toString()))/*Notification with Image*/ 
       .setAutoCancel(true) 
       .setSound(defaultSoundUri) 
       .setContentIntent(pendingIntent); 

注:同樣的問題,我面對的時候,我發送消息,而大圖(基本/簡單推送通知)

看到這個截圖

enter image description here

所以,只關注如何顯示多行信息在通知中?

+0

檢查了這一點:https://stackoverflow.com/a/45415413/4026792 – Thomas

+0

可以使用@Dus答案顯示多行......但是,隨着bigPictureSyle它總是有一行 –

+0

我有一個代碼用於顯示大圖片和文字的Firebase通知。邏輯是,我用來發送fcm通知中的通知ID號給應用程序。 'onMessageReceived'應用程序通過發送該ID號與我的Web應用程序進行通信,並下載與我的Web應用程序中存在的該通知ID相關的數據,並在通知構建器中顯示相同的數據。如果你想我可以在這裏發佈代碼,以便你可以參考。 –

回答

6

你幾乎已經擁有它了,你只需要設置bigText屬性。

NotificationCompat.Builder notificationBuilder = 
      new NotificationCompat.Builder(this) 
        .setSmallIcon(R.mipmap.ic_launcher) 
        .setAutoCancel(true); 

    NotificationCompat.BigTextStyle bigTextStyle = new NotificationCompat.BigTextStyle(); 
    bigTextStyle.setBigContentTitle("Title"); 
    bigTextStyle.bigText("Lorem ipsum dolor sit amet, consectetur adipiscing elit," + 
      " sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. " + 
      "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris " + 
      "nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in."); 

    notificationBuilder.setStyle(bigTextStyle); 

    NotificationManager mNotifyMgr = (NotificationManager) 
      getSystemService(NOTIFICATION_SERVICE); 
    mNotifyMgr.notify(1, notificationBuilder.build()); 

multiline

+0

那麼大影像呢? – Sophie

+0

@Sophie對不起,我不認爲你可以添加大圖像的全文。 – Dus

2

可以顯示多行使用@Dus答案......但隨着bigPictureSyle它總是有一行在setSummaryText方法和其他的選擇是創建RemoteView和實現UI,按您的需要設計

對於RemoteView參考this

3

你應該用你自己的佈局:

Builder builder = new Builder(context); 
builder.setSmallIcon(R.drawable.star_white) 
builder.setAutoCancel(true) 
builder.setContentIntent(pendingIntent); 
builder.setPriority(NotificationCompat.PRIORITY_MAX); 

RemoteViews remoteViewsBig = new RemoteViews(context.getPackageName(), R.layout.notification_big); 
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.notification_small); 
remoteViewsBig.setImageViewBitmap(R.id.banner, bitmap); 

remoteViewsBig.setTextViewText(R.id.button, data.getButtonText()); 
remoteViews.setTextViewText(R.id.button, data.getButtonText()); 

remoteViewsBig.setTextViewText(R.id.text_title, data.getTitle()); 
remoteViews.setTextViewText(R.id.text_title, data.getTitle()); 

remoteViewsBig.setTextViewText(R.id.text_content, data.getContent()); 
remoteViews.setTextViewText(R.id.text_content, data.getContent()); 

builder.setCustomContentView(remoteViews); 
builder.setCustomBigContentView(remoteViewsBig); 

NotificationManager notificationManager = 
      (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
notificationManager.notify(notificationId, builder.build()); 

和XML文件:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       xmlns:tools="http://schemas.android.com/tools" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:background="@color/custom_blue_gray_800" 
       android:orientation="horizontal" 
    > 

    <ImageView 
     android:layout_width="44dp" 
     android:layout_height="44dp" 
     android:layout_gravity="center" 
     android:src="@mipmap/ic_launcher" 
     /> 

    <LinearLayout 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="12dp" 
     android:layout_marginRight="12dp" 
     android:layout_weight="1" 
     android:gravity="center_vertical" 
     android:orientation="vertical" 
     android:padding="8dp" 
     > 

     <TextView 
      android:id="@+id/text_title" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textColor="@android:color/white" 
      android:textSize="16sp" 
      tools:text="Title" 
      /> 

     <TextView 
      android:id="@+id/text_content" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textColor="@android:color/darker_gray" 
      android:textSize="14sp" 
      tools:text="text\ntext\ntext" 
      /> 

    </LinearLayout > 

    <Button 
     android:id="@+id/button" 
     android:layout_width="wrap_content" 
     android:layout_height="36dp" 
     android:layout_gravity="center_vertical" 
     android:background="@drawable/button_main" 
     android:text="Click" 
     android:textColor="@android:color/white" 
     android:textSize="12sp" 
     /> 

</LinearLayout > 

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       xmlns:app="http://schemas.android.com/apk/res-auto" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:background="@color/custom_blue_gray_800" 
       android:orientation="vertical" 
       android:paddingLeft="12dp" 
       android:paddingRight="12dp" 
       android:paddingBottom="12dp" 
    > 

    <include layout="@layout/notification_small" /> 

    <ImageView 
     android:id="@+id/banner" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:adjustViewBounds="true" 
     android:scaleType="centerCrop" 
     /> 


</LinearLayout > 
4

試試這個: -

NotificationCompat.Builder builder = new NotificationCompat.Builder(
     context); 
Notification notification = builder.setContentIntent(contentIntent) 
     .setSmallIcon(icon).setTicker(appname).setWhen(0) 
     .setAutoCancel(true).setContentTitle(appname) 
     .setStyle(new NotificationCompat.BigTextStyle().bigText(message)) 
     .setContentText(message).build(); 

notificationManager.notify(0, notification); 
2

我希望這是用來給你。 檢查:

NotificationCompat.Builder builder = new NotificationCompat.Builder(
      context); 
    Notification notification = builder.setContentIntent(contentIntent) 
      .setSmallIcon(icon).setTicker(appname).setWhen(0) 
      .setAutoCancel(true).setContentTitle(appname) 
      .setStyle(new NotificationCompat.BigTextStyle().bigText(message)) 
      .setContentText(message).build(); 

    notificationManager.notify(0, notification); 

請參考以下鏈接:Display Notification in multiline

謝謝...

+0

那大影像呢? – Sophie

+0

嗨,Sophie使用下面的代碼也參考鏈接.... –

+0

Notification = new Notification.Builder(mContext) .setContentTitle(「New photo from」+ sender.toString()) .setContentText(subject) 。 setSmallIcon(R.drawable.new_post) .setLargeIcon(aBitmap) .setStyle(new Notification.BigPictureStyle() .bigPicture(aBigBitmap)) .build(); –

0

這是我如何管理顯示大圖像和通知一些多行文本。這是我的項目中的工作代碼。

在fcm中有2種fcm消息。 Display MessagesData Messages。我正在使用Data Messages來處理前景和背景中的fcm通知。

/** 
* Created by Mohammed Farhan on 01-08-2017. 
*/ 

public class MyFirebaseMessagingService extends FirebaseMessagingService 
{ 

    private static final String TAG = "MyFirebaseMsgService"; 
    private AppAuth auth; 

    @Override 
    public void onMessageReceived(RemoteMessage remoteMessage) 
    { 
    } 




     /*To check if remoteMessage is empty, if not empty then read the id from "title" field*/ 
     if (remoteMessage.getData().size() > 0) 
     { 
      Map<String, String> data = remoteMessage.getData(); 
      String title = data.get("title"); 
      sendNotification(title); 
      Log.d(TAG, title.toString()); 
     } 

    } 


    private void sendNotification(String title) 
    { 


     final String id = title; 

     /* Here DataFromServer is custom method, used to sync data from my server. It has interface method to listen it when data sync and adding it to local sql completes*/ 
     DataFromServer dataFromServer = new DataFromServer(this); 
     dataFromServer.setDataLoadCompleteListener(new DataLoadCompleteListener() 
     { 
      @Override 
      public void dataLoadComplete() 
      { 

      /*AppNotificationDAO is a class which has many DAO(Data Access Object) method. I have used DAO to make ease in saving,querying data from local sql*/ 
       AppNotificationDAO appNotificationDAO = new AppNotificationDAO(MyFirebaseMessagingService.this); 

       /*getAppNotificationByID is DAO method which does server communication and fetch data from it based on Id(Here its notificationId)*/ 
       AppNotification appNotification = appNotificationDAO.getAppNotificationByID(Long.valueOf(id)); 
       if (appNotification != null) 
       { 
        if (appNotification.getPhoto().equalsIgnoreCase("NA")) 
        { 
        /* photo is a field in my AppNotification class and getPhoto() is getter and appNotification.getPhoto() returns the value stored in it. Here am using it to save url of image related to notification in my web app*/ 

         /*if url is not present then below method displays just a text as notification*/ 
         showBigTextStyleNotification(appNotification); 
        } 
        else 
        { 


        /*if there is url then am running asyncTask to get bitmap of that image and show it in notification tray along with text. Below method does that*/ 
         new showBigPictureStyleNotification(MyFirebaseMessagingService.this, 
           appNotification.getMessage(), 
           Links.NOTIFICATION_IMAGE + "/" + appNotification.getPhoto(), appNotification) 
           .execute(); 

           /* am passing some variables inside above methods, and Links is a class where have defined some strings (links) to my webapp*/ 
        } 
       } 
      } 
     }); 
     dataFromServer.getAppNotificationFromServer(Long.valueOf(id)); 




    } 

    private void displayNotification(AppNotification appNotification) 
    { 
     Intent intent = new Intent(MyFirebaseMessagingService.this, NotificationListActivity.class); 
     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     PendingIntent pendingIntent = PendingIntent.getActivity(MyFirebaseMessagingService.this, 
       0, intent, PendingIntent.FLAG_ONE_SHOT); 

     Uri notificationSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 

     NotificationCompat.Builder builder = new NotificationCompat.Builder(this); 
     builder.setContentTitle("KSP_PQRS"); 
     builder.setContentText(appNotification.getSubject()); 
     builder.setContentIntent(pendingIntent); 
     builder.setSmallIcon(R.drawable.notification); 
     builder.setSound(notificationSoundUri); 
     builder.build(); 

     NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
     notificationManager.notify(100, builder.build()); 
    } 

    private void showBigTextStyleNotification(AppNotification appNotification) 
    { 
     Bitmap icon1 = BitmapFactory.decodeResource(getResources(), 
       R.drawable.police_logo); 

     android.support.v4.app.NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
       this).setAutoCancel(true) 
       .setContentTitle(appNotification.getSubject()) 
       .setSmallIcon(R.drawable.police_logo) 
       .setLargeIcon(icon1) 
       .setContentText(appNotification.getMessage()); 

     NotificationCompat.BigTextStyle bigText = new NotificationCompat.BigTextStyle(); 
     bigText.bigText(appNotification.getMessage()); 
     bigText.setBigContentTitle(appNotification.getSubject()); 
     bigText.setSummaryText(getResources().getString(R.string.app_name)); 
     mBuilder.setStyle(bigText); 
     mBuilder.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)); 
     mBuilder.setPriority(NotificationCompat.PRIORITY_MAX); 

     // Creates an explicit intent for an Activity in your app 
     Intent resultIntent; 
     if (appNotification.getType().equalsIgnoreCase("GEN")) 
     { 
      resultIntent = new Intent(this, NotificationListActivity.class); 
     } 
     else 
     { 
      resultIntent = new Intent(this, MainActivity.class); 
     } 

     TaskStackBuilder stackBuilder = TaskStackBuilder 
       .create(this); 
     stackBuilder.addParentStack(MainActivity.class); 
     stackBuilder.addNextIntent(resultIntent); 
     PendingIntent resultPendingIntent = stackBuilder 
       .getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); 
     mBuilder.setContentIntent(resultPendingIntent); 

     NotificationManager mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE); 
     mNotificationManager.notify(((int) appNotification.getId()) + 1000, mBuilder.build()); 
    } 

    private class showBigPictureStyleNotification extends AsyncTask<String, Void, Bitmap> 
    { 
     private Context mContext; 
     private String title, message, imageUrl; 
     AppNotification appNotification; 

     showBigPictureStyleNotification(Context context, String message, String imageUrl, AppNotification appNotification) 
     { 
      super(); 
      this.mContext = context; 
      this.title = getResources().getString(R.string.app_name); 
      this.message = message; 
      this.imageUrl = imageUrl; 
      this.appNotification = appNotification; 
     } 

     @Override 
     protected Bitmap doInBackground(String... params) 
     { 
      InputStream in; 
      try 
      { 
       auth = new AppAuthDAO(mContext).getAppAuth(); 
       byte[] toEncrypt = (auth.getUsername() + ":" + auth.getPassword() + ":" + auth.getDeviceId()).getBytes(); 
       String encryptedCredentials = Base64.encodeToString(toEncrypt, Base64.NO_WRAP); 

       URL url = new URL(this.imageUrl); 
       HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
       connection.setDoInput(true); 
       connection.setRequestProperty("Authorization", "Basic " + encryptedCredentials); 
       connection.connect(); 
       in = connection.getInputStream(); 
       Bitmap myBitmap = BitmapFactory.decodeStream(in); 
       return myBitmap; 
      } 
      catch (IOException e) 
      { 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     @TargetApi(Build.VERSION_CODES.JELLY_BEAN) 
     @Override 
     protected void onPostExecute(Bitmap result) 
     { 
      super.onPostExecute(result); 

      Intent intent; 
      if (appNotification.getType().equalsIgnoreCase("GEN")) 
      { 
       intent = new Intent(mContext, NotificationListActivity.class); 
      } 

      else 
      { 
       intent = new Intent(mContext, MainActivity.class); 
      } 

      PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 100, intent, PendingIntent.FLAG_ONE_SHOT); 

      NotificationManager notificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); 
      Notification notif = new Notification.Builder(mContext) 
        .setContentIntent(pendingIntent) 
        .setContentTitle(title) 
        .setContentText(appNotification.getSubject()) 
        .setTicker(message) 
        .setSubText(message) 
        .setSmallIcon(R.drawable.police_logo) 
        .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.police_logo)) 

        /*using setStyle am setting big image along with some lines of text in notifications*/ 
        .setStyle(new Notification.BigPictureStyle().bigPicture(result)) 
        .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)) 
        .build(); 
      notif.flags |= Notification.FLAG_AUTO_CANCEL; 
      notificationManager.notify(((int) appNotification.getId()) + 1000, notif); 
     } 
    } 
}