我使用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 vibrate = 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 Google和developers of OneSignal
SDK。
我正在寻找任何有助于消除此问题的解决方法,任何想法或建议。
答案 0 :(得分:10)
我认为发生此崩溃是因为您的通知包含对PendingIntent包中图标的整数引用,并且该整数稍后在发布到NotificationManager时被引用。
在获取整数引用和待处理意图之间,应用程序已更新,所有可绘制引用都已更改。用于引用正确drawable的整数现在引用了不正确的drawable或者根本没有引用(根本没有 - 导致崩溃)
这可以通过
来证明我注意到这个问题的设备数量增加了一个星期 当我稍后发布该应用程序的新版本时,这些数字会减少 为零。
作为解决方案,您可以在应用程序更新后重建所有通知。
答案 1 :(得分:0)
OneSignal的开发人员建议下一步work around:
在<application>
AndroidManifest.xml
标记下添加以下内容
<manifest ...>
<application ...>
...
<receiver android:name="com.onesignal.UpgradeReceiver" tools:node="remove" />
</application>
</manifest>
当我做这个临时解决方案时,这些崩溃消失了。