Опубликовано неверное уведомление — не удалось развернуть RemoteViews для: StatusBarNotification

Я пытаюсь опубликовать уведомление с настраиваемым представлением в области уведомлений из IntentService и получаю ошибку Couldn't expand RemoteView.

Вот что я делаю в onCreate():

mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
icon = R.drawable.icon;
tickerText = "data upload in progress";
contentView = new RemoteViews(getApplicationContext().getPackageName(), R.layout.notiflayout);
contentView.setImageViewResource(R.id.image, R.drawable.icon);
contentView.setTextViewText(R.id.text, "Hello");
contentView.setProgressBar(R.id.progressBar, 100, 10, false);
whatNext = PendingIntent.getActivity(getApplicationContext(), 0, new Intent(getApplicationContext(), starterActivity.class), 0);
notification = new Notification(icon, tickerText, System.currentTimeMillis());
notification.contentView = contentView;
notification.contentIntent = whatNext;

Я звоню notify() из onHandleIntent() и отменяю уведомления в onDestroy().

Я убедился, что этот код работает в независимом приложении, у которого нет IntentService. Делать это в IntentService как-то неудобно.

Может кто-нибудь объяснить, что я делаю неправильно?


person Chaitanya    schedule 02.06.2011    source источник


Ответы (16)


Для меня проблема заключалась в том, что я устанавливал определенную высоту для корневого макета в XML-файле пользовательского представления уведомлений.

Как только я изменил:

android:layout_height="@dimen/notification_expanded"

to

андроид: layout_height = "match_parent"

в корневом макете представления уведомлений проблема была решена.

Также взгляните на этот пример, чтобы увидеть простой пример использования пользовательского макет для уведомлений.

person Iman Akbari    schedule 02.06.2015
comment
В Android 5.0+ мне не удалось исправить эту ошибку Couldn't expand RemoteViews for: StatusBarNotification, пока я не установил высоту пользовательского корня представления на android: layout_height = 64dp ... но я не встречал эту ошибку ниже 5.0, это странно. - person droida; 10.11.2015

по неизвестной причине вам не разрешено ссылаться на измерение в корневом представлении пользовательского удаленного представления! поэтому вам нужно жестко закодировать его как android:layout_height="64dp", но если вы использовали android:layout_height="@dimen/notification_height_that_64", это даст вам Bad notification posted - Couldn't expand RemoteViews for: StatusBarNotification. Я надеюсь, это поможет :)

person M_AWADI    schedule 28.12.2016
comment
Вы спасли мой день... большое спасибо.... но я не знаю, в чем причина... почему не требуется размер для пользовательского просмотра? - person Raghav Sharma; 18.06.2017

В моем случае исключение было вызвано обычным View в моем пользовательском макете уведомлений. По сути, это потому, что вам разрешено использовать только определенные виджеты, такие как TextView, ImageView и так далее.

person Nikolai    schedule 31.10.2016

В моем случае я смог исправить эту ошибку, уменьшив размер значка, который я предоставлял, до .setSmallIcon();

person Ghanendra    schedule 05.02.2017
comment
это также была моя проблема с адаптацией к рекомендуемым размерам Android, исправила это для меня › stuff.mit.edu/afs/sipb/project/android/docs/guide/practices/ - person jon.nicholssoftware.com; 21.01.2020

Для меня проблема заключалась в наличии элемента View в пользовательском макете, установленном для пользовательского уведомления. Удаление элемента View из макета решило проблему публикации неверных уведомлений.

Вот список элементов макета, которые можно использовать, если вы хотите создать собственное уведомление с помощью RemoteView.

Ни проект очистки, ни установка layout_height как match_parent у меня не сработали.

person Reaz Murshed    schedule 11.10.2016

У меня такая же проблема. В моем случае:

причина -> Я использовал для функции builder.setAction(R.drawable.icon,...) векторный рисунок, и я также пытался включить их из библиотеки поддержки, но ничего не сработало. В последних системах Android я не вижу значков действий, в других выдает эту ошибку.

решение -> я ничего не нашел, единственный обходной путь для меня - избегать файлов .xml для рисунков и использовать файлы .png во всех каталогах hdpi mdpi ldpi..

person GabrieleG    schedule 09.11.2017

Я получил ту же ошибку, но проблема для меня заключалась в макете ограничений. Я изменил его на Relative Layout, чтобы решить проблему.

person Jeeva    schedule 14.03.2018

я вижу много проблем, связанных с этой темой, в моем случае эта проблема была вызвана использованием

android:background="?attr/selectableItemBackground" 

я использовал это на своем ImageButton, и каждый раз, когда мое приложение вылетало, но когда я удалял его, все было в порядке, я думаю, проблема в том, что вы не должны использовать какой-либо пользовательский тип View или любые атрибуты темы в своих представлениях, я надеюсь, что это поможет другому застрявшему с этой проблемой

person Mofor Emmanuel    schedule 19.07.2019
comment
Я столкнулся с той же проблемой, и я использовал атрибуты для android: background, поэтому его удаление решило мой случай. - person JPilson; 11.04.2020

@ Ответ Николая был полезен для меня, действительно, это была проблема. Я была такая же проблема. Существуют определенные элементы управления, которые можно использовать в уведомлении. У меня был вид в моем макете для уведомления, как показано ниже.

<View
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="0.04"/>

Это стало причиной аварии. Поддерживаются следующие макеты и элементы управления: введите здесь описание изображения

Согласно этой официальной документации.

Я удалил его, и он работал нормально. Надеюсь, это поможет кому-то.

person Harry .Naeem    schedule 17.09.2018

Будьте осторожны при использовании векторных рисунков. На устройствах до Lollipop установка значка с помощью методов NotificationCompat.Builder, таких как setSmallIcon, приведет к сбою. Вы получите тот же сбой, если используете векторные чертежи в своем пользовательском представлении.

person a.ch.    schedule 19.01.2018

Я столкнулся с той же проблемой при отображении пользовательского макета в уведомлении, и я нашел следующее:

Я использовал ConstraintsLayout в качестве корневого макета моего пользовательского уведомления, это ошибка, которую я совершал. Поскольку существуют некоторые ограничения на использование компоновки ограничений в android.

Наконец, я изменил свой корневой макет на RelativeLayout, и мое уведомление отображается отлично. Я прикрепил свое мнение на скриншоте ниже.

введите здесь описание изображения

person Akshay Paliwal    schedule 29.08.2018

В моем случае проблема заключалась в несоответствии вызова

setShowActionsInCompactView(0)

А то .addAction звонков... Количество действий было разное, отсюда и ошибка

person Teshte    schedule 28.10.2018

Не используйте векторные XML-рисунки для старых версий Android. Это приведет к сбою приложения. Используйте PNG

person Duna    schedule 05.06.2020

Для меня проблема заключалась в том, что NotificationCompat.Builder.addAction значок, который я установил для действия, не совместим со всеми устройствами. Я использую Andriod Studio -> File -> New -> Image Asset для создания значка, после чего все в порядке.

person Al-Mustafa Azhari    schedule 27.10.2020

В моем случае проблема была в значке addAction (1-й аргумент). Я поменял на png, заработало. затем попробовал с 0, тоже сработало.

person Rahim .H    schedule 01.01.2021

Как правило, эта ошибка означает, что ваш контентView является ошибкой, проверьте это! возможно, вам лучше заменить свой contentView макетом, содержащим только TextView. Хорошо, запустите его, надеюсь, вам поможет.

person Guu    schedule 09.06.2015
comment
Привет Гуу, можете ли вы подробно описать, что заменить и почему это может решить ошибку? Ваш ответ попросили проверить, и он не дает четкого способа решить проблему. - person Armfoot; 09.06.2015
comment
хорошо... Я имею в виду, когда я хочу показать уведомление, мне нужен новый объект уведомления и предоставить RemoteViews, например: - person Guu; 16.06.2015
comment
извините, это не конец. RemoteViews вроде этого: RemoteViews contentView = new RemoteViews(getPackageName(),R.layout.notifi_upload); и моя проблема в том, что в макете notifi_upload есть ошибка, возможно, ваш макет сложный, поэтому я предлагаю вам просто поместить TextView в макет и запустить его, надеюсь, вам поможет. - person Guu; 16.06.2015