The requirement was to make a custom notification since the android's default notification only allows for an image. So I went through on how to attach a custom UI for notification when expanded, the ready answer was to create a custom view and pass to the notification manager and allowed from API level 16. So I did one and here the my layout xml code - filename: notification_custom_view_new:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/GhostWhite">
<RelativeLayout
android:id="@+id/header"
android:layout_width="match_parent"
android:layout_height="65dp">
<ImageView
android:id="@+id/big_icon"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_centerVertical="true"
android:layout_marginLeft="12dp"
android:scaleType="fitCenter" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignBottom="@+id/big_icon"
android:layout_alignTop="@+id/big_icon"
android:layout_toRightOf="@+id/big_icon"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:weightSum="2">
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1.6"
android:orientation="vertical">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="1"
android:text="Title"
android:textColor="@color/colorBlackDimText"
android:textSize="16sp"
android:textStyle="bold" />
<TextView
android:id="@+id/message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="2"
android:paddingTop="2dp"
android:text="message"
android:textColor="@color/colorBlackDimText"
android:textSize="14sp" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.4"
android:gravity="center">
<TextView
android:id="@+id/time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="2"
android:padding="8dp"
android:text="24:59"
android:textColor="@color/colorBlackDimText"
android:textSize="12sp" />
</LinearLayout>
</LinearLayout>
</RelativeLayout>
<View
android:id="@+id/shadow"
android:layout_width="match_parent"
android:layout_height="5dp"
android:layout_below="@+id/header"
android:background="@drawable/shadow" />
<ImageView
android:id="@+id/big_picture"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/header"
android:src="@drawable/vector_icon_collections"
android:minHeight="240dp"
android:scaleType="fitCenter" />
</RelativeLayout>
The way I referenced it in code:
private RemoteViews assignRemote(Bitmap bitmap, String title, String message){
RemoteViews expandedView = new RemoteViews(Application.getInstance().getPackageName(),
R.layout.notification_custom_view_new);
expandedView.setTextViewText(R.id.title, title);
expandedView.setTextViewText(R.id.message, message);
expandedView.setImageViewBitmap(R.id.big_picture, bitmap);
expandedView.setImageViewResource(R.id.big_icon, R.mipmap.ic_launcher);
expandedView.setTextViewText(R.id.time, getOnlyHrsMin());
return expandedView;
}
assigning customview to notification manager:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
notification.bigContentView = assignRemote(bitmap, title, message);
}
But this gave me error saying bad notification, I have identified over 15+ same question here on stackoverflow without a right answer.. Some suggest it to be a resource missing and hence the error. I am sure from my end none of the values are null nor resources missing errors are not there in my remote view that is passed.
Any help will be appreciated and also I have tried for around a couple of days to track the error but nothing good seems to happen. Please help me!
Notification Obj Init:
NotificationCompat.BigPictureStyle bigPictureStyle = new NotificationCompat.BigPictureStyle();
bigPictureStyle.setBigContentTitle(title);
bigPictureStyle.setSummaryText(Html.fromHtml(message).toString());
bigPictureStyle.bigPicture(bitmap);
Notification notification;
notification = mBuilder.setSmallIcon(icon).setTicker(title).setWhen(0)
.setAutoCancel(true)
.setContentTitle(title)
.setContentIntent(resultPendingIntent)
.setSound(alarmSound)
.setLights(Color.WHITE, 1500, 2000)
//.setStyle(bigPictureStyle)
.setWhen(getTimeMilliSec(timeStamp))
.setSmallIcon(iconToUse())
.setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(), icon))
.setContentText(message)
.build();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
notification.bigContentView = assignRemote(bitmap, title, message);
}
NotificationManager notificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(Config.NOTIFICATION_ID_BIG_IMAGE, notification);
Stacktrace:
android.app.RemoteServiceException: Bad notification posted from package com.goldadorn.main: Couldn't expand RemoteViews for: StatusBarNotification(pkg=com.goldadorn.main user=UserHandle{0} id=101 tag=null score=0 key=0|com.goldadorn.main|101|null|10220: Notification(pri=0 contentView=com.goldadorn.main/0x1090077 vibrate=null sound=android.resource://com.goldadorn.main/raw/notification defaults=0x0 flags=0x11 color=0x00000000 vis=PRIVATE))
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1480)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5343)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)
Attaching screenshot of the layout UI look:
Remove the 'View' you are using as a shadow in your layout(or Replace View with TextView) and it works fine. XML used for Remoteview should make use of Views which has @android.widget.RemoteViews.RemoteView
annotation. Since a plain View does not has this annotation, you cannot use that in your xml.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With