GCM push notification. Bad notification posted - Couldn't expand RemoteViews for: StatusBarNotification
Asked Answered
I

2

11

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:

layout UI

Icelander answered 8/8, 2016 at 6:46 Comment(7)
Comment View from xml and than try to run your appDanelle
Post some code. How you initialize notification object?Formate
@BurhanuddinRashid But I need the shadow view..Icelander
@Pravin Divraniya Yes I will post that immediatelyIcelander
Please paste the complete error logNourishing
@user1728071 Okay I will do thatIcelander
@DJphy: I'm not sure. But, in the line "notification = mBuilder.setSmallIcon" you have set the build method to usual Notification. But, not the compat one. Try changing according to developer.android.com/guide/topics/ui/notifiers/…Nourishing
A
2

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.

Apogeotropism answered 31/8, 2016 at 7:27 Comment(0)
A
0

You cannot put an EditText into a RemoteViews. RemoteViews is limited to a handful of possible widgets, for a Notification, I doubt that the AdapterView options, like ListView, will work either.have a look here. Hope this will help you as per my experience.

Antihelix answered 19/8, 2016 at 6:13 Comment(1)
Hey @sanat chandravanshi I know you, your from LocalQueen, I had been interviewed by you once.. Okay This could have been a comment.. Well please go through my layout xml file it has no such widgetsIcelander

© 2022 - 2024 — McMap. All rights reserved.