【问题标题】:Firebase Push Notification - How to show multiline message in NotificationFirebase 推送通知 - 如何在通知中显示多行消息
【发布时间】:2018-01-21 19:29:26
【问题描述】:

仅在单行中获取推送通知的message,而我期望在multiple lines 中使用BigPictureStyleBase(两种通知样式) .

请参阅随附的屏幕截图,而在这张图片中,我们只显示了"Hello from Firebase Cloud Messaging",因此它本身适合单行。

但事实是,如果我试图显示 “来自 Firebase 云消息传递的 Hello 和再次来自 Firebase 云消息传递的 Hello”,即使这样我也会在 single line only 中收到带有 三个的消息最后的点像这样...

这是代码所需的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);

注意:同样的问题,我随时都面临,我发送没有大图像的消息(基本/简单推送通知)

查看此屏幕截图

所以,唯一关心的是如何在通知中显示多行消息?

【问题讨论】:

  • 您可以使用@Dus 答案显示多行...但是使用 bigPictureSyle 它总是有单行
  • 我有一个用于显示大图像和文本的 firebase 通知代码。逻辑是,我曾经将 fcm 通知中的通知 ID 号发送到应用程序。 onMessageReceived 应用程序通过发送该 ID 号与我的网络应用程序通信,并下载与我的网络应用程序中存在的通知 ID 相关的数据,并在通知生成器中显示相同的数据。如果你愿意,我可以在这里发布代码,以便你参考。
  • @MohammedFarhan 是的,请......我的荣幸

标签: android firebase push-notification firebase-cloud-messaging


【解决方案1】:

你几乎拥有它,你只需要设置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());

【讨论】:

  • 那么大图呢?
  • @Sophie 抱歉,我不认为你可以添加带有全文的大图。
【解决方案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);

【讨论】:

    【解决方案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】:

      您可以使用@Dus 答案显示多行...但是使用bigPictureSyle 它在 setSummaryText 方法中始终只有一行,其他选项是创建RemoteView 并根据您所需的设计实现 UI

      对于RemoteView 参考this

      【讨论】:

        【解决方案5】:

        我希望你已经习惯了。 检查这个:

           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

        谢谢...

        【讨论】:

        • 大图呢?
        • Notification notif = new Notification.Builder(mContext) .setContentTitle("新照片来自" + sender.toString()) .setContentText(subject) .setSmallIcon(R.drawable.new_post) .setLargeIcon( aBitmap) .setStyle(new Notification.BigPictureStyle() .bigPicture(aBigBitmap)) .build();
        【解决方案6】:

        这就是我设法在通知中显示大图像和一些多行文本的方式。这是我项目中的工作代码。

        fcm 中有两种 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);
                }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2020-06-05
          • 1970-01-01
          • 1970-01-01
          • 2017-03-16
          • 1970-01-01
          • 1970-01-01
          • 2016-04-16
          • 2020-05-09
          • 1970-01-01
          相关资源
          最近更新 更多