這是我如何管理顯示大圖像和通知一些多行文本。這是我的項目中的工作代碼。
在fcm中有2種fcm消息。 Display Messages
和Data 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);
}
}
}
檢查了這一點:https://stackoverflow.com/a/45415413/4026792 – Thomas
可以使用@Dus答案顯示多行......但是,隨着bigPictureSyle它總是有一行 –
我有一個代碼用於顯示大圖片和文字的Firebase通知。邏輯是,我用來發送fcm通知中的通知ID號給應用程序。 'onMessageReceived'應用程序通過發送該ID號與我的Web應用程序進行通信,並下載與我的Web應用程序中存在的該通知ID相關的數據,並在通知構建器中顯示相同的數據。如果你想我可以在這裏發佈代碼,以便你可以參考。 –