修正方法:android.app.RemoteServiceException:パッケージから不正な通知が投稿されました*:アイコンを作成できませんでした:StatusBarIcon


127

クラッシュログに次の例外が表示されます。

android.app.RemoteServiceException: Bad notification posted from package com.my.package: Couldn't create icon: StatusBarIcon(pkg=com.my.package user=0 id=0x7f02015d level=0 visible=true num=0 )
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1456)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:146)
    at android.app.ActivityThread.main(ActivityThread.java:5487)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
    at dalvik.system.NativeStart.main(Native Method)

次のメソッドを使用して、AlarmManagerを介して設定されたPendingIntentからのIntentServiceからの通知を投稿しています。ここで渡されるすべての値は、PendingIntent / IntentServiceのバンドルエクストラからのものです。

/**
 * Notification 
 *
 * @param c
 * @param intent
 * @param notificationId
 * @param title
 * @param message
 * @param largeIcon
 * @param smallIcon
 */
public static void showNotification(Context c, Intent intent,
        int notificationId, String title, String message, int largeIcon,
        int smallIcon) {
    PendingIntent detailsIntent = PendingIntent.getActivity(c,
            notificationId, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    // BUILD
    NotificationCompat.Builder mNotifyBuilder = new NotificationCompat.Builder(
            c);
    // TITLE
    mNotifyBuilder.setContentTitle(title).setContentText(message);

    // ICONS
    mNotifyBuilder.setSmallIcon(smallIcon);
    if (Util.isAndroidOSAtLeast(Build.VERSION_CODES.HONEYCOMB)) {
        Bitmap large_icon_bmp = ((BitmapDrawable) c.getResources()
                .getDrawable(largeIcon)).getBitmap();
        mNotifyBuilder.setLargeIcon(large_icon_bmp);
    }

    mNotifyBuilder.setContentIntent(detailsIntent);
    mNotifyBuilder.setVibrate(new long[] { 500, 1500 });
    mNotifyBuilder.setTicker(message);
    mNotifyBuilder.setContentText(message);

    // NOTIFY
    NotificationManager nm = (NotificationManager) c
            .getSystemService(Context.NOTIFICATION_SERVICE);
    nm.notify(notificationId, mNotifyBuilder.build());
}

他の答えについて私が見たものから-私が見ている例外は、がsetSmallIcon()適切に呼び出されないときに発生します。

渡されたリソースIDがすべて正しいことを確認して再確認しました。


3
同じエラーが発生しています(ライブアプリからのクラッシュレポート)。デバイスで再生できません。私は現在それが人々が.apkを変更したためだと思っています
暗くします

みんな、この方法で私はこの問題を解決できますか?私はpngを使用していますが、アプリがクラッシュすることはほとんどありません
user7856586 '27 / 02/27

回答:


98

起こっていたのは、PendingIntentバンドルにアイコンへの整数参照を含めていたことであり、その整数は、NotificationManagerにポストされている間に後で参照されていました。

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


8
奇妙な。言い換えれば、これは修正可能ではありませんか?アプリでも同じクラッシュが発生します。
Matthias

修正できないようです。私は将来、画像付きの通知を投稿するために別の方法を考案する必要があります...
FishStix

リモートビューのtextSizeをret.setInt(id、 "setTextSize"、20);に設定しようとするとどうなるでしょうか。また、クラッシュします。私たちはユニットも提供する必要があることを知っていますが、そのようなメソッドシグネチャでどのようにそれを行うのですか?ポインタ??
bitsabhi 2016年

1
アプリが更新のために強制終了されたときに通知と関連するすべてをクリアすることは可能ですか?(アプリで問題が回避されると仮定)
NoHarmDan

3
あなたがR.drawable.my_imageを参照したい場合には、それは文字列としてバンドル(して保存する方が安全ですbundle.putString("img", "my_image")実際の@DrawableResに必要なときに、次のように整数に変換後、及び:ctx.resources.getIdentifier(bundle.getString("img"), "drawable", ctx.packageName)
vanomart

52

VectorXml通知内で使用すると、この問題が発生することがわかっています。PNGを使用


4
PNGのみが使用されていました。
FishStix 2016年

私の場合、私は中にベクトルを持っていたdrawableフォルダおよびPNGのではdrawable-hdpixhdpiなどしかし、そこにはPNGはなかったdrawable-mdpi、それは通知を掲示する上MDPIデバイス上に墜落しました。
Vadim Kotov

34

KitkatでSVGを使用しないでください!

キットカットで通知を表示したいときはいつも同じ問題がありました。私に問題を引き起こしたのは、(svgからの)xml内のすべてのアイコン、小さいアイコン、およびアクションアイコンも定義したことです。私がそれらをpng-sで置き換えた後、私の側で問題が解決しました。


4
確認できます。通知内のベクタードローアブルにより、KitKatでRemoteServiceExceptionが発生します。
Khizhny Andrey 2018

2
KitKatの場合、XMLをPNGで置き換えると問題が解決しました:new NotificationCompat.Builder(context、CHANNEL_ID).setSmallIcon(R.drawable.my_icon)
Andrew Glukhoff

1
これでうまくいきました。私はAPI 19を実行していて、通知アイコンにSVGファイルを使用し、小さなpngアイコンに切り替えるまで、このエラーを出していました
WHOATEMYNOODLES

10

android.app.RemoteServiceException:不正な通知が投稿されました

同じ問題がありましたが、解決しました。リモートビューの「.xmlファイル」が問題です。

私のxmlファイルViewでは、LinearLayoutfor仕切りの間に1つ追加されました。

<View
    android:layout_width="match_parent"
    android:layout_height="1dp"
    android:id="@+id/view"
    android:background="#000000" />

上記のViewコンポーネントは、Bad通知例外を作成します。この例外の理由は、Remoteviewsのxmlファイルのみです。

そのViewコンポーネントを削除した後、私のコードは例外なく適切に実行されました。そのため、通知ドロワーはカスタマイズされたビューを受け入れないように感じました。

したがって、RemoteViewオブジェクトの.xmlファイルに上記のビューのようなものを描画しません。


9

私の問題は、私が使用していたアイコン

.setSmallIcon(R.drawable.ic_stat_push_notif)

それに応じて生成されませんでした。公式ドキュメントによると:

密度固有のアイコンセットの提供と複数の画面のサポートで説明されているように、低、中、高、および超高密度の画面を含む、すべての一般的な画面密度に対して個別のアイコンを作成する必要があります。これにより、アプリケーションをインストールできるさまざまなデバイスでアイコンが正しく表示されます。

上記を埋めるための最良の方法として、私はhttps://romannurik.github.io/AndroidAssetStudio/index.htmlで Roman Nurikが提供する通知ジェネレーターを使用しました

このようにして、画像を使用して(背景が透明であることを考慮に入れて)、ジェネレーターに通知アイコンのさまざまなサイズを生成するジョブを実行させることができます。

最も重要なことは、使用する画像を参照した後にアイコンジェネレーターが白い塗りつぶしの円または四角形を表示する場合、おそらく透明度がないために画像に問題があるため、あなたはこれで大丈夫です。


2
私の場合、私は中にベクトルを持っていたdrawableフォルダおよびPNGのではdrawable-hdpixhdpiなどしかし、そこにはPNGはなかったdrawable-mdpi、それは通知を掲示する上MDPIデバイス上に墜落しました。
Vadim Kotov

7

私のアプリでは、この種のバグはアップグレード中にのみ発生します。新しいバージョンでリソースIDが変更されると、Android RemoteViewはリソースを見つけられず、をスローする場合がありRemoteServiceExceptionます。3番目のバージョンを公開し、リソースIDを変更しない場合、バグは一時的にしか消えないことがあります。

編集することで、バグのこの種を低減することが可能であるres/values/public.xmlres/values/ids.xml。リソースIDがpublic.xmlまたはにない場合、コンパイラーは個別のリソースIDを生成しids.xmlます。リソース名を変更したり、新しいリソースを追加したりすると、IDが変更され、一部のデバイスがそれを見つけられない場合があります。

したがって、手順は次のとおりです。

  1. apkファイルを逆コンパイルし、res/values検索しpublic.xmlids.xml
  2. アプリでRemoteViewに関連するすべてのリソースを見つけてコピーします(文字列、ディメンション、ドローアブル、レイアウト、ID、カラー...)
  3. ソースコードを作成してpublic.xmlそのids.xmlres/valuesに、コピーした行を貼り付けます

注意:

Gradle 1.3.0以降では、ローカルを無視しpublic.xmlます。それを機能させるには、スクリプトをあなたの中に追加する必要がありますbuild.gradle

afterEvaluate {
    for (variant in android.applicationVariants) {
        def scope = variant.getVariantData().getScope()
        String mergeTaskName = scope.getMergeResourcesTask().name
        def mergeTask = tasks.getByName(mergeTaskName)
        mergeTask.doLast {
            copy {
                int i=0
                from(android.sourceSets.main.res.srcDirs) {
                    include 'values/public.xml'
                    rename 'public.xml', (i == 0? "public.xml": "public_${i}.xml")
                    i++
                }
                into(mergeTask.outputDir)
            }
        }
    }
}

注:このスクリプトはサブモジュールプロジェクトをサポートしていません。私はそれを修正しようとしています。


3

同じアイコンをパスしています

     <meta-data
        android:name="com.google.firebase.messaging.default_notification_icon"
        android:resource="@drawable/ic_stat_name" />

そしてあなたは通知

 NotificationCompat.Builder notificationBuilder =
                new NotificationCompat.Builder(this, channelId)
                        .setSmallIcon(R.drawable.ic_stat_name)
                        .setContentTitle("Title")
                        .setContentText(messageBody)
                        .setAutoCancel(true)
                        .setSound(defaultSoundUri)
                        .setContentIntent(pendingIntent);

2
リソースとしてベクター画像を渡しましたが、oneplus / android 6デバイスでクラッシュを引き起こしたと思います。100%についてはわかりません。
Alexey

3

アイコンが重要でない場合に備えて、交換できます。

R.drawable.your_icon

android.R.drawable.some_standard_icon

これでうまくいきます!


2

クラスでの通知の使用がFirebaseMessagingServiceから拡張されると、RemoteServiceExceptionが発生しました。AndroidManifest.xmlに次のコードを追加しました。

<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/ic_small" />

また、メソッドsetSmallIcon(int icon)によってクラスNotification.Builderのインスタンスに設定されたリソースic_small。


このメタデータは<service </ service>タグ内に追加する必要がありますか?
アンドレイ

2

Android Studioバージョン3.0.0以降では、drawablesフォルダーに新しい画像を追加するときに、drawable-v24ではなくdrawableを選択します。ここに画像の説明を入力してください

あなたが使用している画像がすでに(v24)である場合は、それをコピーして同じディレクトリ(ドローアブルなど)に貼り付けてください。今回は通常またはv24のどちらかを尋ねてきます。v24でないことを確認してもう一度試してください。これでエラーが修正されます。


注意-「Android」ビューにいる場合は、「プロジェクト」ビューに切り替えてください。Androidビューでは、ドローアブルv24ディレクトリが表示されない場合があります
Hatzil

2

同じ問題が私にも起こりました、そして私は同じことを解決しました

理由:これは、RemoteViewにベクタードローアブルを使用しているために発生し、ベクタードローアブルはコンパイル時にドローアブルを生成します。また、アプリをアップしているときに、一部のデバイスが生成されたドローアブルリソースIDを検出できない理由もわかりません。しかし、はい、これが理由でした。

再現 手順1.以前のビルドをインストールします。2.通知を送信する3.次のバージョンコードでビルドを更新する4.アプリを更新した後、アプリを開かずにもう一度通知を送信する

解決法 ベクトルドローアブルを通常のドローアブル(.pngまたは.jpg)ファイルに置き換えます。

これで問題が解決することを願っています。


1

アプリの更新中に通知が表示されていると、これに遭遇する可能性があります。必要な場合があるのは、PACKAGE_CHANGEDメッセージを待機するBroadcastReceiverを作成することです。この時点で、すべてのサービスをシャットダウンして、関連する通知も閉じます。

 <receiver android:name=".MyBroadcastReceiver">
    <intent-filter>
        <action android:name="android.intent.action.PACKAGE_CHANGED" />
    </intent-filter>
</receiver>

0

バンドルで通知を設定したときにも同じ問題が発生しました。私はこれを試しました、そしてそれは私の問題を解決しました:

builder.setLargeIcon(large_icon);
builder.setSmallIcon(R.drawable.small_icon);

setLargeIcon()がsetSmallIcon()の前に呼び出されていることを確認してください。


4
なぜこれが役立つのですか?
リミティウム

0

私も同じ問題を抱えていました。問題は、使用しているアイコンにあります。私はandroid.R.drawable.stat_sys_downloadを使用していました。drawables.xmlに移動して貼り付けます。

<resources>
 <item name="ic_start_download" type="drawable">@android:drawable/stat_sys_download</item>
</resource>

そしてあなたのコードで

builder.setSmallIcon(R.drawable.ic_start_download);

この画像の代わりに他の画像を試すことができます


0

これを解決するための私の方法:レイアウトに「悪い」ビュー(例:チェックボックス)があったため、それらを削除しました。

RemoteViewは画像とテキストのみをサポートしているようです(ドキュメントを読んで確認する必要があります)。


0

android.support.constraint.ConstraintLayoutを使用するとRemoteServiceExceptionが発生しました。それをLinearLayoutまたはRelativeに変更し、コンテナのandroid:layout_height = "wrap_content"も変更します


0

(これは現在の質問の解決策ではありませんが、同様の主要な問題を持つ人を助けます)私も同じ問題を抱えていましたが、私の場合、同じ問題を引き起こしている破損した.pngファイルを使用しました。だから私はそれを削除し、正しい.pngファイルを再含めました。


0

カスタム通知レイアウトから置き換え<android.support.v7.widget.AppCompatTextViewてください<TextView

android.support.v7.widget.AppCompatTextViewまたはandroid.support.v7.widget.AppCompatImageView実行時にのみ機能するため。

だから使用するTextViewImageView


0

まだこの問題が発生している場合:ic_stat_ic_notificationという名前(またはuのような任意の名前)でpngファイルをドローアブルフォルダーに追加します

そしてあなたのマニフェストにいくつかの行の下に追加します

ここでアイコンを作成できます-> https://romannurik.github.io/AndroidAssetStudio/icon


0

プロジェクトを同期し、それをクリーンアップするのではなく、[ファイル]> [同期]の順にクリックします。ビルド>プロジェクトのクリーンアップ

それが皆さんのお役に立てば幸いです


0

通知ビューのテキストビューのautolinkとlinksClickableオプションが原因でこのエラーが発生しました:

<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:autoLink="all"
        android:linksClickable="true"
        android:text="@string/app_name"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textColor="@color/white" />

注意してください!


-3

これでうまくいきました。アイコンの参照にコメントを付けると、NotificationCompat.Builderを問題なく使用できます。

    $msg_notificacion = [
                        'title'         => "titulonotif",
                       // "icon" : "myicon",
                        'body'          =>"cuerponotif"
                    ];
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.