web-dev-qa-db-ja.com

不適切な通知: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から投稿された不正な通知:次のRemoteViewを展開できませんでした:StatusBarNotification(pkg = my.package user = UserHandle {0} id = -1542711428 tag = null key = 0 | my .package | -1542711428 | null | 10184:Android.app.ActivityThreadでの通知(pri = 0 contentView = null vibrate = null sound = null defaults = 0x0 flags = 0x19 color = 0xff56a0d3 vis = PUBLIC semFlags = 0x0 semPriority = 0))) $ H.handleMessage(ActivityThread.Java:1813)at Android.os.Handler.dispatchMessage(Handler.Java:102)at Android.os.Looper.loop(Looper.Java:154)at Android.app.ActivityThread.main( ActivityThread.Java:6776)at Java.lang.reflect.Method.invoke(Method.Java)at com.Android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.Java:1496)at com.Android.internal.os .ZygoteInit.main(ZygoteInit.Java:1386)

残念ながら、Android Nougatを使用しているデバイスでこの問題を再現して、それを排除する方法を理解することはできません。

通知のアイコンなどのグラフィックリソースを変更して、プロジェクトをクリーンアップして このアドバイス に従いました。

この問題が発生するデバイスの数は、新しいバージョンのアプリをリリースしたときに1週間にわたって増加していることに気付きました。これらの数はゼロに減少します。

この問題も Googleに報告 および OneSignal SDKの開発者 です。

この問題を解消するのに役立つ回避策、アイデア、提案を探しています。

14
Dima Kozhevin

このクラッシュは、通知にPendingIntentバンドルのアイコンへの整数参照が含まれており、その整数が後でNotificationManagerにポストされている間に参照されたために発生すると思います。

整数参照を取得してから保留中のインテントが発生するまでの間に、アプリが更新され、すべての描画可能な参照が変更されました。正しいドローアブルを参照するために使用されていた整数は、誤ったドローアブルを参照するか、まったく参照しない(まったく何もない-このクラッシュの原因)

これは

この問題が発生するデバイスの数は、新しいバージョンのアプリをリリースしたときに1週間にわたって増加していることに気付きました。これらの数はゼロに減少します。

ソリューションとして、アプリケーションが更新された後にすべての通知を再構築できます。

10
Dmitriy Puchkov

OneSignalの開発者は、次に行うことをお勧めします 回避策

<application>AndroidManifest.xmlタグの下に以下を追加します

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

これらのクラッシュは、この一時的な解決策を実行したときに解消されました。

0
Dima Kozhevin