クラッシュログに次の例外が表示されます。
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がすべて正しいことを確認し、再確認しました。
何が起こっていたのか、PendingIntentバンドルにアイコンへの整数参照を含めていましたが、その整数は後でNotificationManagerに投稿されている間に参照されていました。
整数参照を取得してから保留中の意図が消えるまでの間に、アプリが更新され、すべての描画可能な参照が変更されました。正しいドロウアブルを参照するために使用されていた整数は、不正なドロウアブルを参照するか、まったくなしを参照するようになりました(まったくなし-このクラッシュの原因)
通知内でVectorXml
を使用すると、この問題が発生することがわかっています。 pngを使用
KitKatでSVGを使用しないでください!
KitKatで通知を表示するたびに、同じ問題が発生しました。私にとって問題の原因は、xml(svgから)のすべてのアイコン、小さなアイコン、アクションアイコンも定義していることです。それらをpng-sに置き換えた後、私の側で問題は解決しました。
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ファイルには、上記のビューのようなものは何も描画しません。
私の問題は、使用していたアイコンが
.setSmallIcon(R.drawable.ic_stat_Push_notif)
それに応じて生成されませんでした。 公式ドキュメント によると:
密度固有のアイコンセットの提供と複数の画面のサポートで説明されているように、低密度、中密度、高密度、および超高密度の画面を含む、一般化されたすべての画面密度に対して個別のアイコンを作成する必要があります。これにより、アプリケーションをインストールできるデバイスの範囲全体でアイコンが適切に表示されるようになります。
したがって、上記を完全に埋めるための最良の方法は、Notification Generatoron Roman Nurik提供- https://romannurik.github.io/AndroidAssetStudio/index.html
そのようにして、画像を使用して(背景が透明でなければならないことを考慮して)、通知アイコンのさまざまなサイズを生成するジョブをジェネレーターに実行させることができます。
最も重要なことは、使用する画像を閲覧した後、アイコンジェネレーターが白い塗りつぶされた円または正方形を表示する場合、画像に問題があることです。おそらく透明度がないため、これは大丈夫です。
私のアプリでは、この種のバグはアップグレード中にのみ発生します。新しいバージョンでリソースIDが変更された場合、Android RemoteView
はリソースの検索に失敗し、RemoteServiceException
を捨てることがあります。 3番目のバージョンを公開し、リソースIDを変更しないと、バグが消える場合があります一時的にのみ。
res/values/public.xml
およびres/values/ids.xml
を編集することにより、この種のバグを減らすことができます。リソースIDがpublic.xml
またはids.xml
にない場合、コンパイラは個々のリソースIDを生成します。リソース名を変更するか、新しいリソースを追加すると、IDが変更され、一部のデバイスがそれを見つけられない場合があります。
したがって、手順は次のとおりです。
res/values
でpublic.xml
およびids.xml
を見つけますpublic.xml
の下にids.xml
とres/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)
}
}
}
}
注:このスクリプトは、サブモジュールプロジェクトをサポートしていません。私はそれを修正しようとしています。
同じアイコンを渡しました
<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);
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)ファイルに置き換えます。
これで問題が解決することを願っています。
バンドルに通知を設定したときに同じ問題が発生しました。私はこれを試し、それは私の問題を解決しました:
builder.setLargeIcon(large_icon);
builder.setSmallIcon(R.drawable.small_icon);
SetSmallIcon()の前にsetLargeIcon()が呼び出されることを確認してください。
これを解決する私の方法:レイアウトに「悪い」ビューがありました(例:チェックボックス)-そこでそれらを削除しました。
RemoteViewは画像とテキストのみをサポートしているようです(ドキュメントを読むことで確認されます)。
まだこの問題に直面している人がいる場合:ic_stat_ic_notification(またはuのような任意の名前)を使用して、Drawableフォルダーにpngファイルを追加します。
あなたのマニフェストで数行の下に追加します
ここでアイコンを作成できます-> https://romannurik.github.io/AndroidAssetStudio/icon
Android.support.constraint.ConstraintLayoutを使用すると、RemoteServiceExceptionが発生しました。コンテナのLinearLayoutまたはRelativeに変更し、Android:layout_height = "wrap_content"に変更します
(これは現在の質問の解決策ではありませんが、同様のコアの問題を持つ人に役立ちます)私も同じ問題を抱えていましたが、私の場合は同じ問題を引き起こしている破損した.pngファイルを使用しました。だから私はそれを削除し、正しい.pngファイルを再インクルードしました。
カスタム通知レイアウトの<Android.support.v7.widget.AppCompatTextView
を<TextView
に置き換えてください。
Android.support.v7.widget.AppCompatTextView
またはAndroid.support.v7.widget.AppCompatImageView
は実行時にのみ機能するためです。
TextView
またはImageView
を使用します
アイコンが重要でない場合に備えて、交換できます。
R.drawable.your_icon
に
Android.R.drawable.some_standard_icon
これは動作します!
私も同じ問題を抱えていました。問題は、使用しているアイコンにあります。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);
この画像の代わりに他の画像を試すことができます
プロジェクトを同期してからクリーン、ファイル>同期してから:ビルド>プロジェクトのクリーン
それが皆さんの助けになることを願っています、それは私のために働いています