Плохое уведомление: не удалось развернуть RemoteViews для: StatusBarNotification. на Android Nougat

Я использую OneSignal SDK, чтобы показывать уведомления. Я делаю это в OneSignalPushService.java.

OneSignalPushService.java:

public class OneSignalPushService extends NotificationExtenderService {

    @Override
    protected boolean onNotificationProcessing(OSNotificationReceivedResult notification) {

        if (!TinyDbWrap.getInstance().isPushEnabled()) {
            KLog.d(this.getClass().getSimpleName(), "Notification will not displayed");
            return true;
        }

        OverrideSettings overrideSettings = new OverrideSettings();
        overrideSettings.extender = new NotificationCompat.Extender() {
            @Override
            public NotificationCompat.Builder extend(NotificationCompat.Builder notificationBuilder) {
                notificationBuilder.setDefaults(0);
                notificationBuilder.setContentTitle(getApplicationContext().getResources().getString(R.string.app_name));

                boolean is_in_silent_mode = false; /*or true by user's settings in app*/
                /*TinyDbWrap.getInstance()... - it stores user's settings*/
                KLog.d(OneSignalPushService.class.getSimpleName(), "Notification isSoundPushEnabled: " + TinyDbWrap.getInstance().isSoundPushEnabled());
                if (!is_in_silent_mode && TinyDbWrap.getInstance().isSoundPushEnabled()) {
                    notificationBuilder.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION));
                } else {
                    notificationBuilder.setSound(null);
                }

                KLog.d(OneSignalPushService.class.getSimpleName(), "Notification isVibrationPushEnabled: " + TinyDbWrap.getInstance().isVibrationPushEnabled());
                if (!is_in_silent_mode && TinyDbWrap.getInstance().isVibrationPushEnabled()) {
                    notificationBuilder.setVibrate(new long[]{0, 100, 200, 300, 400});
                } else {
                    notificationBuilder.setVibrate(new long[]{0});
                }

                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    notificationBuilder.setColor(ContextCompat.getColor(getApplicationContext(), R.color.bg_first_item_white_scheme));
                }
                notificationBuilder.setLights(ContextCompat.getColor(getApplicationContext(), R.color.time_white_sheme), 500, 500);
                return notificationBuilder;
            }
        };

        OSNotificationDisplayedResult result = displayNotification(overrideSettings);
        if (result != null) {
            KLog.d(OneSignalPushService.class.getSimpleName(), "Notification displayed with id: " + result.androidNotificationId);
        }

        return true;
    }

}

Это хорошо работает на всех моих устройствах, но:

Я получаю большое количество этой проблемы на Crashlytics только на устройствах с Android Nougat:

Неустранимое исключение: android.app.RemoteServiceException: неверное уведомление отправлено из пакета my.package: не удалось развернуть RemoteViews для: StatusBarNotification (pkg = my.package user = UserHandle {0} id = -1542711428 tag = null key = 0 | my .package | -1542711428 | null | 10184: Уведомление (pri = 0 contentView = null vibrate = null sound = null по умолчанию = 0x0 flags = 0x19 color = 0xff56a0d3 vis = PUBLIC semFlags = 0x0 semPriority = 0)) в android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1813) в android.os.Handler.dispatchMessage (Handler.java:102) в android.os.Looper.loop (Looper.java:154) в android.app.ActivityThread.main ( ActivityThread.java:6776) на java.lang.reflect.Method.invoke (Method.java) на com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1496) на com.android.internal.os .ZygoteInit.main (ZygoteInit.java:1386)

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

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

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

Об этой проблеме также сообщалось в Google и разработчики OneSignal SDK.

Я ищу обходные пути, любые идеи или предложения, которые могут помочь устранить эту проблему.


person Dima Kozhevin    schedule 22.10.2017    source источник
comment
когда вы отправляете уведомление об одном сигнале, вы передаете параметр Big Picture?   -  person Amjad Khan    schedule 24.10.2017
comment
stackoverflow.com/questions/25317659/   -  person Rajesh    schedule 24.10.2017
comment
@AmjadKhan нет, вы можете увидеть все параметры здесь - drive.google .com / file / d / 0B-D8XWFJqEwxYW9OVzd6Snp3d0U /   -  person Dima Kozhevin    schedule 24.10.2017
comment
@RajeshKushvaha Я думаю, ваша ссылка бесполезна, потому что моя проблема возникает только на Android Nougat, но не на всех Android Nougat. Кроме того, я проверил все ответы (как я думаю) на SO, прежде чем задать свой вопрос   -  person Dima Kozhevin    schedule 24.10.2017
comment
После отправки уведомления обновили ли вы apk для воспроизведения в магазине или возникли проблемы из-за заголовка сообщения = null   -  person Amjad Khan    schedule 24.10.2017
comment
@AmjadKhan Проблема возникает после обновления, и через несколько дней она стремится к нулю. И это повторяется каждый раз после обновления на небольшом количестве устройств.   -  person Dima Kozhevin    schedule 24.10.2017
comment
Да, у меня такая же проблема, потому что если вы отправите уведомление и после этого, если вы обновите приложение, и пользователь, который загрузил, получит эту ошибку в Nougat и более поздней версии   -  person Amjad Khan    schedule 24.10.2017
comment
@ Дима Кожевин Проблема решена или существует?   -  person Amjad Khan    schedule 26.10.2017
comment
@AmjadKhan Нет, как вы можете видеть в этом выпуске github.com/OneSignal/OneSignal -Android-SDK / issues / 263 он все еще жив, и проблема не решена, более того, разработчики пытались ее решить. Уже начинаю думать, что это исключение проще отловить, как временное решение проблемы, хотя это не очень инженерный подход. Благодарим за Ваше участие.   -  person Dima Kozhevin    schedule 26.10.2017
comment
Итак, вы нашли какое-нибудь решение?   -  person Ian Medeiros    schedule 08.07.2018
comment
@IanMedeiros Эта работа помогает мне   -  person Dima Kozhevin    schedule 08.07.2018


Ответы (2)


Я думаю, что этот сбой происходит из-за того, что ваше уведомление включает целочисленную ссылку на значок в пакете PendingIntent, и на это целое число позже ссылались при отправке в NotificationManager.

В промежутке между получением целочисленной ссылки и срабатыванием ожидающего намерения приложение было обновлено, и все доступные для рисования ссылки изменились. Целое число, которое использовалось для ссылки на правильную возможность рисования, теперь ссылалось либо на неправильную возможность рисования, либо вообще на нее (вообще не было - вызывая этот сбой)

Об этом свидетельствует

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

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

person Dmitriy Puchkov    schedule 31.10.2017
comment
Предположим, ваше решение было правильным. Как же тогда объяснить, что этого не происходит на всех Android-Nougat устройствах? И, могу ошибаться, но повторное создание уведомлений происходит после обновления, но это не помогает. Вы можете увидеть это здесь - relignfer3d56e05ebf_d150a1fe409d56e098f_db_digi_e_d_05_d_05_d_05 Android-SDK / фиксация / - person Dima Kozhevin; 31.10.2017
comment
@DimaKozhevin Разработчики Google вносят некоторые изменения в уведомления на Android N android-developers.googleblog.com/2016/06/ Возможно, это повлияло на исправление данного бага. Насчет пересоздания уведомлений вообще-то не уверен, что ресивер работает, было бы неплохо проверить. - person Dmitriy Puchkov; 31.10.2017
comment
Разработчики Google все время вносят какие-то изменения. Это очень общее заявление. Не могли бы вы предложить решение этой проблемы? В любом случае я поддержал ваш ответ. Спасибо за внимание к моему вопросу. - person Dima Kozhevin; 31.10.2017
comment
Спасибо, мужик. Могу только посоветовать обернуть его в блок try-catch. - person Dmitriy Puchkov; 31.10.2017
comment
@DmitriyPuchkov У меня такая же проблема без sdk одного сигнала, и эта проблема возникает у меня, проблема, которая приводит к этому исключению, - это воссоздание постоянного уведомления. К сожалению, это нельзя обернуть с помощью try catch, поток полностью проходит через внутренние классы - person Kirill Kulakov; 06.11.2017
comment
У меня такая же проблема, и я перестраиваю все свои уведомления после MY_PACKAGE_REPLACED. И это не помогает. У меня все еще возникают сбои после обновления с устройств Motorola на версии Android Nougat. - person kolombo; 20.11.2017
comment
@KirillKulakov @kolombo А вы вообще можете воспроизвести проблему? Это ключевой момент, поскольку я считаю, что до окончательного Couldn't expand RemoteViews for: сбоя произойдет несколько входов в logcat. - person jkasten; 01.12.2017
comment
@jkasten, к сожалению, нет, я видел только крах ткани - person Kirill Kulakov; 03.12.2017

Разработчики OneSignal предлагают выполнить следующую работу. :

Добавьте следующее под тегом <application> в AndroidManifest.xml

<manifest ...>
    <application ...>
        ...
        <receiver android:name="com.onesignal.UpgradeReceiver" tools:node="remove" />
    </application>
</manifest>

Эти сбои исчезли, когда я применил это временное решение.

person Dima Kozhevin    schedule 28.05.2018
comment
это решение только для Android Nougat. Я получил этот сбой, но подозреваемый - Киткат (4.4.2), почти все Киткаты получили удар - person Nanda Z; 12.06.2019