【问题标题】:Bad Notification: Couldn't expand RemoteViews for: StatusBarNotification. on Android Nougat错误通知:无法扩展 RemoteViews:StatusBarNotification。在安卓牛轧糖上
【发布时间】:2018-04-03 01:28:16
【问题描述】:

我使用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;
    }

}

这适用于我所有的设备,但是:

我仅在装有 Android Nougat 的设备上收到大量关于 Crashlytics 的此问题:

致命异常: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 振动=null sound=null defaults=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 重现此问题,以了解如何消除它。

为了关注this advice,我尝试更改通知图标等图形资源,清理项目。

我注意到,当我稍后发布该应用的新版本时,出现此问题的设备数量在一周内增加,这些数字减少到零。

这个问题还有reported to Googledevelopers of OneSignal SDK

我正在寻找可以帮助解决此问题的任何解决方法、任何想法或建议。

【问题讨论】:

  • 当您发送一个信号通知时,您是否传递了 Big Picture 参数?
  • @AmjadKhan 不,你可以在这里看到所有参数 - drive.google.com/file/d/0B-D8XWFJqEwxYW9OVzd6Snp3d0U/…
  • @RajeshKushvaha 我认为您的链接没有用,因为我的问题仅发生在 Android Nougat 而不是所有 Android Nougat。另外,在我问问题之前,我检查了所有关于 SO 的答案(我认为)
  • 发送通知后,您是否更新了apk以播放商店或由于Message Title = null而引发的问题

标签: java android android-notifications onesignal android-7.0-nougat


【解决方案1】:

我认为发生此崩溃是因为您的通知包含对 PendingIntent 包中图标的整数引用,并且该整数后来在发布到 NotificationManager 时被引用。

在获取整数引用和挂起的 Intent 之间,应用程序被更新并且所有可绘制引用都发生了变化。用于引用正确可绘制对象的整数现在引用了不正确的可绘制对象或根本没有引用(根本没有 - 导致此崩溃)

这由

证明

我注意到出现此问题的设备数量连续一周增加 当我稍后发布应用程序的新版本时,这些数字会减少 归零。

作为一种解决方案,您可以在应用程序更新后重建所有通知。

【讨论】:

  • 假设您的决定是正确的。那么你怎么能解释它在所有Android-Nougat 设备上都没有发生呢?而且,我可能是错的,但是更新后会重新创建通知,但这没有帮助。你可以在这里看到 - github.com/OneSignal/OneSignal-Android-SDK/commit/…
  • @DimaKozhevin Google 开发人员在 Android N android-developers.googleblog.com/2016/06/… 上的通知中进行了一些更改,也许这会影响对这个错误的更正。关于通知的重新创建实际上我不确定接收器是否有效,最好检查一下。
  • Google 开发者总是会做出一些改变。这是一个非常笼统的说法。你能建议这个问题的解决方案吗?无论如何,我都赞成你的回答。感谢您关注我的问题。
  • 谢谢你。我只能建议将其包装在 try-catch 块中。
  • @DmitriyPuchkov 我有同样的问题,没有一个信号 sdk,这个问题发生在我身上,导致此异常的问题是重新创建持久通知。不幸的是,这不能用 try catch 包装,流程完全是通过内部类
【解决方案2】:

OneSignal 的开发者建议接下来做一个work around:

AndroidManifest.xml 中的<application> 标记下添加以下内容

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

当我执行这个临时解决方案时,这些崩溃消失了。

【讨论】:

  • 此解决方案仅适用于 Android Nougat。我遇到了这次崩溃,但嫌疑人是 Kitkat (4.4.2) 几乎所有的 kitkat 都受到了影响
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-30
  • 2020-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多