android.app.RemoteServiceException: плохое уведомление отправлено из пакета. Не удалось расширить RemoteViews для: StatusBarNotification
Я реализовал пользовательское уведомление с виджетом RemoteViews. Я тестировал его на Android 5.0.2 и Android 6.0. Работало нормально. Но через некоторое время он начал падать каждый раз, когда получал уведомление от GCM.
Crash Dump -
Process: package.name, PID: 27743
android.app.RemoteServiceException: Bad notification posted from package package.name: Couldn't expand RemoteViews for: StatusBarNotification(pkg=package.name user=UserHandle{0} id=1524095391 tag=null key=0|package.name|1524095391|null|10247: Notification(pri=0 contentView=package.name/0x7f040033 vibrate=null sound=null defaults=0x0 flags=0x10 color=0x00000000 category=recommendation vis=PUBLIC))
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1631)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
Мой макет для RemoteViews имеет ImageView внутри LinearLayout и пользовательские классы TextView, которые расширяют TextView.
Мой код для создания уведомления
private void showCustomNotification(ABCNotification notification) {
RemoteViews notificationView = new RemoteViews(getPackageName(), R.layout.layout_notification);
PendingIntent contentPendingIntent = PendingIntent.getBroadcast(mContext, 0, notification.getContentIntent(), PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext);
builder.setSmallIcon(R.drawable.ic_notification).setAutoCancel(true).setContentIntent(contentPendingIntent);
// Set Notification Priority
builder.setPriority(notification.getNotificationPriority());
// Set Notification Category
builder.setCategory(notification.getNotificationCategory());
// Set Notification Visibility
builder.setVisibility(notification.getNotificationVisibility());
notificationView.setTextViewText(R.id.tv_notification_title, notification.getTitle());
notificationView.setTextViewText(R.id.tv_notification_message, notification.getMessage());
notificationView.setTextViewText(R.id.tv_notification_subtext, notification.getSubtext());
Notification notif = builder.build();
if (null != notif) {
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {
notif.bigContentView = notificationView;
}
notif.contentView = notificationView;
NotificationManager notificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(mNotificationId, notif);
}
}
Мой макет для RemoteViews что-то вроде этого
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingBottom="4dp"
android:paddingTop="4dp">
<com.abc.ui.customviews.fonts.TextViewYMRegular
android:id="@+id/tv_notification_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:ellipsize="end"
android:singleLine="true"
android:textColor="@color/black"
android:textSize="16sp" />
<com.abc.ui.customviews.fonts.TextViewYMMedium
android:id="@+id/tv_notification_message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:textColor="@color/black"
android:textSize="14sp" />
<com.abc.ui.customviews.fonts.TextViewYMMedium
android:id="@+id/tv_notification_subtext"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@color/black"
android:textSize="12sp" />
</LinearLayout>
</LinearLayout>
Я видел почти все решения по переполнению стека. Ничто не похоже на работу.
Самое смешное, что раньше все работало идеально. Но через некоторое время начал падать. Все в течение 2 часов.
1 ответ
Как прокомментировал Майк, мы не можем использовать собственные представления, даже если они являются прямыми потомками нативных представлений.
Я использовал TextViewYMRegular, который расширял TextView. Я изменил все пользовательские TextViews на родные.
Мы можем использовать только перечисленные здесь классы с RemoteViews.
В моем случае у меня было
androidx.appcompat.widget.AppCompatTextView
androidx.appcompat.widget.AppCompatImageView
в моем layout.xml
!
Я просто изменил их на ImageView и TextView, и моя проблема решена!
Еще один поворот в этой проблеме - я реализовал в своем приложении модуль динамических функций, который содержал службу и уведомление. У меня был точно такой же сбой на Android 6, когда они создавали файл макета для RemoteViews уведомлений, как и в каталоге res динамического модуля, в то время как он работал нормально на Android 10. Я переместил их ресурс макета в каталог res основного модуля, а затем на Android 6 он тоже стал нормально работать.