web-dev-qa-db-fra.com

Notification incorrecte: impossible de développer RemoteViews pour: StatusBarNotification. sur Android Nougat

J'utilise OneSignal SDK pour afficher les notifications. Je le fais dans 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;
    }

}

Cela fonctionne bien sur tous mes appareils mais:

Je reçois un grand nombre de ce numéro sur Crashlytics uniquement sur les appareils dotés d'Android Nougat:

Fatal Exception: Android.app.RemoteServiceException: Notification incorrecte envoyé du colis mon.package: Impossible de développer RemoteViews pour: StatusBarNotification (pkg = my.package user = UserHandle {0} id = -1542711428 tag = null clé = 0 | my.package | -1542711428 | null | 10184: Notification (pri = 0 contentView = null vibrate = null son = null default = 0x0 flags = 0x19 color = 0xff56a0d3 vis = PUBLIC semFlags = 0x0 semPriority = 0)) sur Android.app.ActivityThread $ H.handleMessage (ActivityThread.Java:1813) sur Android.os.Handler.dispatchMessage (Handler.Java:102) sur Android.os.Looper.loop (Looper.Java:154) sur Android.app.ActivityThread.main (ActivityThread.Java:6776) à Java.lang.reflect.Method.invoke (Method.Java) sur com.Android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.Java:1496) sur com.Android.internal.os.ZygoteInit.main (ZygoteInit.Java:1386)

Malheureusement, je ne peux pas reproduire ce problème sur mes appareils avec Android Nougat pour comprendre comment je peux l'éliminer.

J'ai essayé de changer les ressources graphiques telles que les icônes de notification, de nettoyer le projet afin de suivre ce conseil .

J'ai remarqué que le nombre d'appareils présentant ce problème augmentait pendant une semaine lorsque je publiais une nouvelle version de l'application plus tard, leur nombre diminuant à zéro.

Ce problème concerne également signalé à Google et les développeurs de OneSignal SDK .

Je recherche des solutions de contournement, des idées ou des suggestions pouvant aider à résoudre ce problème.

14
Dima Kozhevin

Je pense que cet incident se produit car votre notification inclut la référence entière à l'icône du bundle PendingIntent et que cet entier a ensuite été référencé lors de sa publication dans le NotificationManager.

Entre l'obtention de la référence au nombre entier et la suppression de l'intention en attente, l'application a été mise à jour et toutes les références pouvant être extraites ont été modifiées. Le nombre entier utilisé pour référencer le dessin correct correct fait maintenant référence au tirage incorrect ou nul (aucun du tout - provoquant ce blocage)

Ceci est démontré par 

J'ai remarqué que le nombre d'appareils présentant ce problème augmentait pendant une semaine lorsque je publie une nouvelle version de l'application plus tard, ces chiffres diminuent à zéro.

En tant que solution, vous pouvez reconstruire toutes les notifications après la mise à jour de l'application.

9
Dmitriy Puchkov

Les développeurs de OneSignal suggèrent de faire ensuite un travail autour de :

Ajouter ce qui suit sous la balise <application> dans un AndroidManifest.xml

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

Ces accidents ont disparu lorsque j'ai proposé cette solution temporaire.

0
Dima Kozhevin