programing

Android 푸시 알림:알림에 표시되지 않는 아이콘, 대신 흰색 사각형이 표시됨

padding 2023. 10. 20. 13:29
반응형

Android 푸시 알림:알림에 표시되지 않는 아이콘, 대신 흰색 사각형이 표시됨

앱에서 알림이 생성되는데 해당 알림에 대해 설정한 아이콘이 표시되지 않습니다.대신 저는 흰색 사각형을 받습니다.

아이콘의 png 크기를 조정해 보았습니다(차원 720x720, 66x66, 44x44, 22x22).신기하게도, 더 작은 치수를 사용할 때 흰색 사각형이 더 작습니다.

이 문제와 함께 알림을 생성하는 정확한 방법을 구글에서 검색했으며, 제가 읽은 코드는 정확해야 합니다.애석하게도 상황이 정상이 아닙니다.

제 전화기는 안드로이드 5.1.1을 탑재한 넥서스 5입니다.이 문제는 에뮬레이터(Android 5.0.1이 적용된 Samsung Galaxy s4와 Android 5.0.1이 적용된 Motorola Motora G)에도 있습니다.

알림 코드는 다음과 같고 스크린샷은 두 개입니다.더 많은 정보가 필요하시면 언제든지 요청해주세요.

모두에게 감사를 표합니다.

@SuppressLint("NewApi") private void sendNotification(String msg, String title, String link, Bundle bundle) {
    NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    Intent resultIntent = new Intent(getApplicationContext(), MainActivity.class);
    resultIntent.putExtras(bundle);
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
            resultIntent, Intent.FLAG_ACTIVITY_NEW_TASK);
    Notification notification;
    Uri sound = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.notificationsound);
    notification = new Notification.Builder(this)
                .setSmallIcon(R.drawable.lg_logo)
                .setContentTitle(title)
                .setStyle(new Notification.BigTextStyle().bigText(msg))
                .setAutoCancel(true)
                .setContentText(msg)
                .setContentIntent(contentIntent)
                .setSound(sound)
                .build();
    notificationManager.notify(0, notification);
}

without opening the notification notifications opened

원인: 5.0 롤리팝의 경우 "알림 아이콘은 완전히 흰색이어야 합니다.

타겟 SDK를 20으로 설정하여 화이트 아이콘 문제를 해결하면 우리 앱은 안드로이드 롤리팝을 타겟으로 하지 않기 때문에 롤리팝 고유의 기능을 사용할 수 없습니다.

대상 Sdk용 솔루션 21

롤리팝 재료 아이콘을 지원하려면 롤리팝과 위 버전의 투명 아이콘을 만드십시오.다음을 참조하시기 바랍니다: https://design.google.com/icons/

http://developer.android.com/design/style/iconography.html, 을 보면 안드로이드 롤리팝에서 알림이 표시되는 방식이 흰색 스타일임을 확인할 수 있습니다.

롤리팝에서도 구글은 흰색 알림 아이콘 뒤에 표시되는 색상을 사용할 것을 제안합니다.링크 참조: https://developer.android.com/about/versions/android-5.0-changes.html

원하는 곳에 Colors https://developer.android.com/reference/android/support/v4/app/NotificationCompat.Builder.html#setColor(int) 을 추가할 수 있습니다.

Lollipop OS 버전 이하 및 위 버전에 대한 Notification Builder 구현:

Notification notification = new NotificationCompat.Builder(this);
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    notification.setSmallIcon(R.drawable.icon_transperent);
    notification.setColor(getResources().getColor(R.color.notification_color));
} else { 
    notification.setSmallIcon(R.drawable.icon);
} 

참고: setColor는 롤리팝에서만 사용할 수 있으며 아이콘의 배경에만 영향을 미칩니다.

그것은 여러분의 문제를 완전히 해결해 줄 것입니다!!

Google Cloud Messaging을 사용하는 경우 아이콘을 변경하는 것만으로 이 문제가 해결되지 않습니다.예를 들어, 다음과 같이 작동하지 않습니다.

 Notification notification  = new Notification.Builder(this)
                .setContentTitle(title)
                .setContentText(text)
                .setSmallIcon(R.drawable.ic_notification)
                .setContentIntent(pIntent)
                .setDefaults(Notification.DEFAULT_SOUND|Notification.DEFAULT_LIGHTS|Notification.DEFAULT_VIBRATE)
                .setAutoCancel(true)
                .build();

ic_notification이 투명하고 흰색이더라도.매니페스트 메타데이터에서도 다음과 같이 정의해야 합니다.

  <meta-data android:name="com.google.firebase.messaging.default_notification_icon"

            android:resource="@drawable/ic_notification" />

메타데이터는 아래에 있습니다.application태그(참조용).

(Android Studio 3.5) 최신 버전의 Android Studio를 사용하는 경우 알림 이미지를 생성할 수 있습니다.res 폴더 > New > Image Asset에서 마우스 오른쪽 버튼을 클릭합니다.그러면 아래 이미지와 같이 Configure Image Assets(이미지 자산 구성)가 표시됩니다.아이콘 유형알림 아이콘으로 변경합니다.당신의 이미지는 하얗고 투명해야 합니다.Configure Image Assets(이미지 자산 구성)는 해당 규칙을 적용합니다.Configure Image Assets 중요:아이콘을 클라우드/푸시 알림에 사용하려면 새로 생성된 알림 아이콘을 사용하려면 응용프로그램 태그 아래에 메타데이터를 추가해야 합니다.

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

구글의 디자인 가이드라인에 따르면:

알림 아이콘은 완전히 흰색이어야 합니다.

Android Manifest에서 다음 코드를 선언합니다.

<meta-data android:name="com.google.firebase.messaging.default_notification_icon" 

android:resource="@drawable/ic_stat_name" />

저는 같은 문제에 직면하고 있었습니다. 많은 답변을 시도했지만 아무런 해결책을 얻지 못했습니다. 마침내 문제를 해결할 방법을 찾았습니다.

  • 투명한 배경으로 알림 아이콘을 만듭니다.앱의 너비와 높이는 크기 이하이어야 하며 프로젝트에 이 모든 것을 붙여넣어야 합니다->app->src->main->res

  • MDPI 24*24

  • HDPI 36*36

  • XHDPI 48*48

  • XXHDPI 72*72


위의 내용을 onMessageReceived 메소드에 붙여넣은 후 아래 행을 입력합니다.


Intent intent = new Intent(this, News.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,
                    PendingIntent.FLAG_ONE_SHOT);
            Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
            NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this);
            if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
            {
                notificationBuilder.setSmallIcon(R.drawable.notify)
                                      //            .setContentTitle(title)
                            //                        .setContentText(message)
                        .setAutoCancel(true)
                        .setSound(defaultSoundUri)
                        .setContentIntent(pendingIntent);
            } else
                {
                    notificationBuilder.setSmallIcon(R.drawable.notify)
                       //                                .setContentTitle(title)
                        //                        .setContentText(message)
                            .setAutoCancel(true)
                            .setSound(defaultSoundUri)
                            .setContentIntent(pendingIntent);
            }
            NotificationManager notificationManager =
                    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            notificationManager.notify(0, notificationBuilder.build());

매니페스트 파일에 이 코드를 추가하는 것을 잊지 마십시오.

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

우리는 아래와 같이 할 수 있습니다.

알림 작성기의 새 개체를 만들고 호출합니다.setSmallIcon()아래 코드와 같이 Notification Builder 개체를 사용합니다.

우리가 앱을 설치하는 OS 버전을 확인하는 방법을 만듭니다. 만약 그것이 롤리팝 i.e API 21 아래에 있다면 그것은 배경색을 가진 일반 앱 아이콘을 가지고 갈 것이고, 그렇지 않으면 그것은 배경색 없이 투명 앱 아이콘을 가질 것입니다.그래서 os version >= 21을 사용하는 기기들은 아이콘의 배경색을 방법으로 설정할 것입니다.setColor()Notification Builder 클래스의.

샘플 코드:

NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this);

notificationBuilder.setSmallIcon(getNotificationIcon(notificationBuilder));

private int getNotificationIcon(NotificationCompat.Builder notificationBuilder) {

   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
             int color = 0x008000;
             notificationBuilder.setColor(color);
             return R.drawable.app_icon_lolipop_above;

    } 
    return R.drawable.app_icon_lolipop_below;
}

아래 코드를 추가하여 매니페스트에 문제를 해결하였습니다.

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

    <meta-data
        android:name="com.google.firebase.messaging.default_notification_color"
        android:resource="@color/black" />

어디에ic_stat_nameAndroid Studio에서 생성된 right 클릭 res >> 새로 만들기 >> 이미지 자산 >> IconType (알림)

그리고 알림 페이로드로 서버 php쪽에서 해야할 단계가 하나 더 있습니다.

$message = [
    "message" => [
        "notification" => [
            "body"  => $title , 
            "title" => $message
        ],

        "token" => $token,

    "android" => [
           "notification" => [
            "sound"  => "default",
            "icon"  => "ic_stat_name"
            ]
        ],

       "data" => [
            "title" => $title,
            "message" => $message
         ]


    ]
];

섹션을 메모합니다.

    "android" => [
           "notification" => [
            "sound"  => "default",
            "icon"  => "ic_stat_name"
            ]
        ]

여기서 아이콘 이름은"icon" => "ic_stat_name"매니페스트에 동일한 설정이 있어야 합니다.

막대사탕 지원 알림 아이콘을 제공하려면 두 가지 유형의 알림 아이콘을 만듭니다.

  1. normal notification 아이콘 : 아래 롤리팝 버전에 대해.
  2. 투명한 배경의 알림 아이콘 : 롤리팝 이상 버전의 경우.

이제 OS 버전의 실행 시간을 기준으로 적절한 아이콘을 Notification Builder로 설정합니다.

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    mBuilder.setSmallIcon(R.drawable.ic_push_notification_transperent);
} else {
    mBuilder.setSmallIcon(R.drawable.ic_push_notification);
}

드디어 이 문제에 대한 해결책이 생겼습니다.

이 문제는 앱이 전혀 실행되고 있지 않을 때만 발생합니다. (백그라운드 또는 포그라운드에서 neither).앱이 전경 또는 배경에서 실행되면 알림 아이콘이 제대로 표시됩니다(흰색 사각형이 아님).

따라서 백엔드 API의 알림 아이콘에 대해서는 Frontend와 동일한 구성을 설정해야 합니다.

프론트엔드에서는 리액트 네이티브를 사용했고 푸시 알림에서는 리액트 네이티브-fcmnpm 패키지를 사용했습니다.

FCM.on("notification", notif => {
   FCM.presentLocalNotification({
       body: notif.fcm.body,
       title: notif.fcm.title,
       big_text: notif.fcm.body,
       priority: "high",
       large_icon: "notification_icon", // notification icon
       icon: "notification_icon",
       show_in_foreground: true,
       color: '#8bc34b',
       vibrate: 300,
       lights: true,
       status: notif.status
   });
});

Node.js를 push 알림 백엔드로 사용한 fcm-push npm 패키지를 사용하여 payload 구조를 아래와 같이 설정하였습니다.

{
  to: '/topics/user', // required
  data: {
    id:212,
    message: 'test message',
    title: 'test title'
  },
  notification: {
    title: 'test title',
    body: 'test message',
    icon : 'notification_icon', // same name as mentioned in the front end
    color : '#8bc34b',
    click_action : "BROADCAST"
  }
}

기본적으로 안드로이드 시스템에 로컬에 저장된 notification_icon 이미지를 검색합니다.

통지는 아래에 설명된 대로 회색 규모입니다.그들은 다른 사람들이 쓴 글에도 불구하고 흑백이 아닙니다.네트워크 강도 막대와 같이 여러 가지 음영이 있는 아이콘을 본 적이 있을 것입니다.

API 21 (롤리팝 5.0) 이전 버전에서는 컬러 아이콘이 작동합니다.응용 프로그램이 API 20을 대상으로 강제 적용할 수 있지만, 이는 응용 프로그램에서 사용할 수 있는 기능을 제한하므로 권장하지 않습니다.실행 중인 API 레벨을 테스트하고 색상 아이콘이나 그레이스케일 아이콘을 적절하게 설정할 수 있지만 이는 가치가 없을 가능성이 높습니다.대부분의 경우 회색 스케일 아이콘을 사용하는 것이 가장 좋습니다.

영상에는 RGBA(빨간색/녹색/파란색/알파)의 4개 채널이 있습니다.알림 아이콘의 경우 안드로이드는 R, G, B 채널을 무시합니다.불투명도라고도 알려진 알파 채널만 계산할 수 있습니다.도면 색상의 알파 값을 제어할 수 있는 편집기로 아이콘을 디자인합니다.

Alpha 값이 회색 스케일 이미지를 생성하는 방법:

  • 알파 = 0(transpa) — 이 픽셀은 투명하며 배경색을 나타냅니다.
  • 알파 = 255 (opaque) — 이 픽셀은 흰색입니다.
  • 알파 = 1 ... 254 — 이 픽셀은 여러분이 예상하는 것과 정확히 일치하며 투명과 흰색 사이의 음영을 제공합니다.

를 사용하여 변경하기setColor:

  • .NotificationCompat.Builder.setColor(int argb). 다음에 대한 설명서에서Notification.color:

    이 알림을 표시할 때 표준 스타일 템플릿에서 적용할 악센트 색상(Color의 상수와 같은 ARGB 정수).현재 템플릿 설계에서는 아이콘 이미지(흰색으로 스텐실 처리)를 이 색의 필드 위에 겹쳐 화려한 헤더 이미지를 구성합니다.알파 성분은 무시됩니다.

    setColor로 테스트한 결과 Alpha 성분이 무시되지 않습니다.알파 값이 높으면 픽셀이 흰색으로 바뀝니다.Alpha 값이 낮으면 픽셀이 알림 영역의 배경색(내 장치의 검은색) 또는 풀다운 알림의 지정된 색으로 바뀝니다.

이 문제를 해결하기 위한 요구 사항:

  1. 이미지 형식: 32비트 PNG(알파 포함)

  2. 이미지는 투명해야 합니다.

  3. 투명색 지수: 흰색(FFFFFF)

출처 : http://gr1350.blogspot.com/2017/01/problem-with-setsmallicon.html

우리만의 흰색 아이콘을 만들 수 있는 링크를 찾았습니다

이 링크를 사용하여 런처 아이콘의 흰색 아이콘을 생성합니다.

링크를 열고 ic_launcher 또는 알림 아이콘을 업로드합니다.

사용자 지정 로컬 알림을 위해 AndroidManifest.xml에서 다음 메타데이터를 추가하면 작동합니다.

 <application
    android:name="xxxxxx"
        android:label="xxxxxx"
        android:icon="@mipmap/ic_launcher"
        
        >

       <meta-data
                android:name="your_apps_bundle_id.default_notification_icon"
                android:resource="@drawable/ic_notif" />

......

안드로이드 8.0에서도 비슷한 문제가 있습니다.WHITE 아이콘 리소스를 사용해 보십시오.아이콘에 색상 이미지를 사용하려고 할 때 흰색 사각형이 있고 흰색 아이콘으로 교체하면 작업이 시작됩니다.

버전에 따라 다른 아이콘을 사용할 수 있습니다.아이콘에 로직을 설정하기만 하면 다음과 같습니다.

int icon = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? R.drawable.colored_: R.drawable.white_tint_icon_for_lolipop_or_upper;

SDK >= 23의 경우 setLargeIcon을 추가해주세요

notification = new Notification.Builder(this)
            .setSmallIcon(R.drawable.ic_launcher)
            .setLargeIcon(context.getResources(), R.drawable.lg_logo))
            .setContentTitle(title)
            .setStyle(new Notification.BigTextStyle().bigText(msg))
            .setAutoCancel(true)
            .setContentText(msg)
            .setContentIntent(contentIntent)
            .setSound(sound)
            .build();

컬러풀 아이콘을 유지하고 싶을 때 - 해결 방법
아이콘에 약간 다른 색의 픽셀을 추가합니다.
저의 경우에는 음영과 빛이 있는 검은색 아이콘을 가지고 있습니다.다크 블루 픽셀을 추가하면 작동합니다.

SDK 특정 버전을 줄이려면 다음과 같이 간단히 수행할 수 있습니다. ('#'을 '0x'로 바꿉니다.)

Notification notification = new NotificationCompat.Builder(this);
notification.setSmallIcon(R.drawable.icon_transperent);
notification.setColor(0x169AB9); //for color: #169AB9

방금 png를 투명 png로 변환했는데 아이콘이 사진과 모양은 같았지만 색상은 똑같지 않았습니다.

웹사이트 중 하나를 이용하여 아이콘의 배경을 제거하고 https://www.remove.bg/ 을 제안한 다음 다운로드 후 해당 이미지를 사용하면 문제가 해결됩니다.

언급URL : https://stackoverflow.com/questions/30795431/android-push-notifications-icon-not-displaying-in-notification-white-square-sh

반응형