sgoliver - notificaciones push android php mysql
Notificación de inserción de Firebase: cómo mostrar un mensaje de línea múltiple en Notificación (6)
Casi lo tienes, solo necesitas configurar la propiedad 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());
Recibo el message
Push Notification solo en una línea , mientras que lo esperaba en multiple lines
con BigPictureStyle
y Base (ambos estilos de notificación).
Consulte la Captura de pantalla adjunta, mientras que en esta imagen, solo mostramos "Hello from Firebase Cloud Messaging"
modo que cabe en una sola línea.
Pero el hecho es que si intento mostrar "Hola desde Firebase Cloud Messaging y nuevamente Hello from Firebase Cloud Messaging", incluso recibo el mensaje en una single line only
con tres puntos al final como este ...
Aquí está la part
requerida del código , estoy usando:
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);
NOTA: El mismo problema, me enfrento cada vez, estoy enviando un mensaje sin una imagen grande (Base / notificación simple push)
Ver esta captura de pantalla :
Entonces, la única preocupación es ¿Cómo mostrar un mensaje de línea múltiple en Notificación? .
Puede mostrar líneas múltiples usando @Dus answer ... Pero con bigPictureSyle
siempre tendrá una sola línea en el método setSummaryText y otra opción es crear RemoteView
e implementar la interfaz de usuario según su diseño requerido
Para RemoteView
esto
Debes usar tu propio diseño:
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());
Y archivos 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 >
y
<?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 >
prueba esto:-
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);
Espero que esto esté acostumbrado a ti. Mira esto:
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);
Consulte este enlace: Mostrar notificación en multilínea
Gracias...
Así es como logro mostrar una imagen grande y algunos textos de varias líneas en notificación. Este es código de trabajo en mi proyecto.
Hay 2 tipos de mensajes fcm en fcm. Display Messages
y Data Messages
. Y estoy usando los Data Messages
para manejar la notificación fcm en primer plano y en segundo plano.
/**
* 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);
}
}
}