web-dev-qa-db-ja.com

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

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

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がすべて正しいことを確認し、再確認しました。

106
FishStix

何が起こっていたのか、PendingIntentバンドルにアイコンへの整数参照を含めていましたが、その整数は後でNotificationManagerに投稿されている間に参照されていました。

整数参照を取得してから保留中の意図が消えるまでの間に、アプリが更新され、すべての描画可能な参照が変更されました。正しいドロウアブルを参照するために使用されていた整数は、不正なドロウアブルを参照するか、まったくなしを参照するようになりました(まったくなし-このクラッシュの原因)

94
FishStix

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

46
Bubunyo Nyavor

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

KitKatで通知を表示するたびに、同じ問題が発生しました。私にとって問題の原因は、xml(svgから)のすべてのアイコン、小さなアイコン、アクションアイコンも定義していることです。それらをpng-sに置き換えた後、私の側で問題は解決しました。

20
bendaf

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

私は同じ問題を抱えていましたが、解決しました。私の問題は、リモートビューの「.xmlファイル」です。

私のxmlファイルには、分周器のViewの間にLinearLayoutが1つ追加されました。

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

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

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

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

9
Kona Suresh

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

.setSmallIcon(R.drawable.ic_stat_Push_notif)

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

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

したがって、上記を完全に埋めるための最良の方法は、Notification Generatoron Roman Nurik提供- https://romannurik.github.io/AndroidAssetStudio/index.html

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

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

6
Carlos Daniel

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

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

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

  1. Apkファイルを逆コンパイルし、res/valuespublic.xmlおよびids.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)
            }
        }
    }
}

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

6
thundertrick

同じアイコンを渡しました

     <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);
3
Tarun Umath

Android St​​udioバージョン3.0.0以降では、drawablesフォルダーに新しい画像を追加するときに、drawable-v24ではなくdrawableを選択します。 enter image description here

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

1
Haider Malik

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

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

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

私にも同じ問題が発生し、同じ問題を解決しました

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

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

SOLUTIONベクトルdrawableを通常のdrawable(.pngまたは.jpg)ファイルに置き換えます。

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

1
Gajju

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

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

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

0
Jelly

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

RemoteViewは画像とテキストのみをサポートしているようです(ドキュメントを読むことで確認されます)。

0
Benjamin Piette

まだこの問題に直面している人がいる場合:ic_stat_ic_notification(またはuのような任意の名前)を使用して、Drawableフォルダーにpngファイルを追加します。

あなたのマニフェストで数行の下に追加します

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

0
Jayapen Jose

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

0
JustAndrew

(これは現在の質問の解決策ではありませんが、同様のコアの問題を持つ人に役立ちます)私も同じ問題を抱えていましたが、私の場合は同じ問題を引き起こしている破損した.pngファイルを使用しました。だから私はそれを削除し、正しい.pngファイルを再インクルードしました。

0
RameshJanagama

カスタム通知レイアウトの<Android.support.v7.widget.AppCompatTextView<TextViewに置き換えてください。

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

TextViewまたはImageViewを使用します

0

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

R.drawable.your_icon

Android.R.drawable.some_standard_icon

これは動作します!

0
Ashwin Balani

私も同じ問題を抱えていました。問題は、使用しているアイコンにあります。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