GCM 推送通知。发布错误通知 - 无法扩展 RemoteViews:StatusBarNotification

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

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 Whosebug 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.请帮助我!

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:

不能将 EditText 放入 RemoteViews。 RemoteViews 仅限于少数几个可能的小部件,对于 Notification,我怀疑 AdapterView 选项(如 ListView)是否也能正常工作。have a look here。希望这会根据我的经验对您有所帮助。

删除您在布局中用作阴影的 'View'(或将 View 替换为 TextView),它工作正常。 XML 用于 Remoteview 应使用具有 @android.widget.RemoteViews.RemoteView 注释的视图。由于普通视图没有此注释,因此您不能在 xml.

中使用它