수정 방법 : 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

답변:


98

무슨 일이 있었는지 PendingIntent 번들의 아이콘에 대한 정수 참조를 포함하고 있었고 그 정수는 나중에 NotificationManager에 게시되는 동안 참조되었습니다.

정수 참조를 가져오고 보류중인 인 텐트가 시작되는 사이에 앱이 업데이트되고 모든 드로어 블 참조가 변경되었습니다. 올바른 드로어 블을 참조하는 데 사용 된 정수가 이제 잘못된 드로어 블을 참조하거나 전혀 참조하지 않았습니다 (전혀 없음-이 충돌을 일으킴).


8
기괴한. 즉, 이것은 고칠 수 없습니까? 내 앱에서 동일한 충돌이 발생합니다.
Matthias

고칠 수없는 것 같습니다. 나는 미래에 ... 미래에 이미지를 게시 알림에 대해 갈 수있는 다른 방법을 고안해야 할 것이다
FishStix

원격 뷰의 textSize를 ret.setInt (id, "setTextSize", 20);로 설정하려고하면 어떨까요? 또한 충돌합니다. 우리는 또한 단위를 제공해야한다는 것을 알고 있지만, 그러한 메소드 서명으로 어떻게 그렇게 할 수 있습니까? 어떤 포인터 ??
bitsabhi

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

제 경우에는 drawable폴더에 벡터가 drawable-hdpi있고 xhdpi, 등에 png가 있습니다 . 그러나에 대한 png가 없었고 drawable-mdpi알림을 게시 할 때 MDPI 장치에서 충돌이 발생했습니다.
Vadim Kotov 19.01.24

34

Kitkat에서 SVG를 사용하지 마십시오!

Kitkat에 알림을 표시하고 싶을 때마다 같은 문제가 발생했습니다. 나에게 문제를 일으킨 것은 xml의 모든 아이콘 (svg에서), 작은 아이콘 및 작업 아이콘도 정의했기 때문입니다. 내가 그들을 png-s로 교체 한 후 문제는 내 편에서 해결되었습니다.


4
확인할 수 있습니다. 알림의 벡터 드로어 블은 KitKat에서 RemoteServiceException을 발생시킵니다.
Khizhny Andrey

2
새로운 NotificationCompat.Builder (문맥, CHANNEL_ID) .setSmallIcon (R.drawable.my_icon) : 나는에서 PNG로 XML을 교체 할 때 킷캣의 경우, 문제가 해결되었다
앤드류 Glukhoff

1
이것은 나를 위해 일했습니다. 나는 작은 PNG 아이콘으로 전환 할 때까지 나는, API (19)을 실행하고 알림 아이콘에 대한 SVG 파일을 사용하고 날이 오류를 제공 하였다
WHOATEMYNOODLES

10

android.app.RemoteServiceException : 잘못된 알림이 게시 됨

나는 같은 문제가 있었지만 해결되었습니다. 내 문제는 원격보기의 ".xml 파일"입니다.

내 xml 파일 에서 구분선 View사이 에 하나 를 추가 했습니다 LinearLayout.

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

View잘못된 알림 예외를 생성하는 위의 구성 요소입니다. 이 예외 이유는 Remoteviews의 xml 파일입니다.

해당 View 구성 요소를 제거한 후 내 코드가 예외없이 제대로 실행되었습니다. 그래서 알림 서랍이 사용자 정의 된 뷰를 받아들이지 않는다고 느꼈습니다.

따라서 RemoteView객체 의 .xml 파일에 위의보기와 같은 것을 그리지 않습니다 .


9

내 문제는 내가 사용하고 있던 아이콘이

.setSmallIcon(R.drawable.ic_stat_push_notif)

그에 따라 생성되지 않았습니다. 공식 문서 에 따르면 :

밀도 별 아이콘 세트 제공 및 다중 화면 지원에 설명 된대로 저밀도, 중 밀도, 고밀도 및 초 고밀도 화면을 포함하여 모든 일반화 된 화면 밀도에 대해 별도의 아이콘을 만들어야합니다. 이렇게하면 응용 프로그램을 설치할 수있는 장치 범위에서 아이콘이 제대로 표시됩니다.

따라서 위 내용을 채우는 가장 좋은 방법 은 https://romannurik.github.io/AndroidAssetStudio/index.html에서 Roman Nurik이 제공 하는 알림 생성기를 사용했습니다.

그런 식으로 이미지를 사용하고 (투명한 배경이 있어야한다는 점을 고려) 생성기가 알림 아이콘에 대해 다양한 크기를 생성하도록 할 수 있습니다.

가장 중요한 것은 사용할 이미지를 탐색 한 후 아이콘 생성기가 흰색으로 채워진 원이나 사각형을 표시하는 경우 이미지에 문제가있는 것입니다. 투명도가 없기 때문일 수 있으므로 괜찮아요.


2
제 경우에는 drawable폴더에 벡터가 drawable-hdpi있고 xhdpi, 등에 png가 있습니다 . 그러나에 대한 png가 없었고 drawable-mdpi알림을 게시 할 때 MDPI 장치에서 충돌이 발생했습니다.
Vadim Kotov

7

내 앱에서 이런 종류의 버그는 업그레이드 중에 만 발생합니다. 최신 버전에서 리소스 ID가 변경되면 Android RemoteView가 리소스를 찾지 못하고 RemoteServiceException. 세 번째 버전을 게시하고 리소스 ID를 변경하지 않으면 버그가 일시적으로 만 사라질 수 있습니다 .

res/values/public.xml및 .NET을 편집 하여 이러한 종류의 버그를 줄일 수 있습니다 res/values/ids.xml. 리소스 ID가 public.xml또는에 없는 경우 컴파일러는 개별 리소스 ID를 생성합니다 ids.xml. 리소스 이름을 변경하거나 새 리소스를 추가하면 ID가 변경되어 일부 장치에서 찾지 못할 수 있습니다.

따라서 단계는 다음과 같습니다.

  1. APK에 파일을 디 컴파일에 res/values찾아 public.xmlids.xml
  2. 앱에서 RemoteView와 관련된 모든 리소스를 찾아 복사합니다 (문자열, 치수, 드로어 블, 레이아웃, ID, 색상 ...).
  3. 작성 public.xmlids.xml아래에 res/values소스 코드와 u는 방금 복사 한 라인을 붙여

노트 :

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> 태그 안에 추가해야합니까?
Andrey

2

Android Studio 버전 3.0.0 이상에서 drawables 폴더에 새 이미지를 추가 할 때 drawable-v24 대신 drawable을 선택합니다.여기에 이미지 설명 입력

사용중인 이미지가 이미 (v24) 인 경우 복사하여 동일한 디렉토리 (예 : 드로어 블)에 붙여 넣습니다. 이번에는 어떤 일반 또는 v24를 묻는 메시지가 표시됩니다. v24가 아닌지 확인하고 다시 시도하면 오류가 해결됩니다.


참고- "Android"보기에있는 경우 "프로젝트"보기로 전환하십시오. Android보기에서 드로어 블 v24 디렉토리가 표시되지 않을 수 있습니다.
Hatzil

2

나에게도 같은 문제가 발생했으며 동일한 문제를 해결했습니다.

이유 : 이것은 우리가 RemoteViews에 벡터 드로어 블을 사용하고 있고 벡터 드로어 블이 컴파일 타임에 드로어 블을 생성하기 때문에 발생합니다. 또한 앱을 업그레이드하는 동안 일부 장치가 생성 된 드로어 블 리소스 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);

setSmallIcon () 전에 setLargeIcon ()이 호출되었는지 확인하십시오.


4
이것이 왜 도움이됩니까?
limitium

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런타임에만 작동 하기 때문 입니다.

그래서 사용 TextView또는ImageView



0

프로젝트를 동기화하고 Clean it보다 File> Synchronize 다음 : Build> Clean Project

여러분 모두에게 도움이되기를 바랍니다.


0

알림보기의 textview에서 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.