Android O에서 더 이상 사용되지 않는 NotificationCompat.Builder


161

프로젝트를 Android O로 업그레이드 한 후

buildToolsVersion "26.0.1"

Android Studio의 Lint는 팔로우 알림 작성기 메소드에 대해 더 이상 사용되지 않는 경고를 표시합니다.

new NotificationCompat.Builder(context)

문제는 Android 개발자 가 Android O의 알림 을 지원하기 위해 NotificationChannel 을 설명하는 설명서를 업데이트하고 스 니펫을 제공하지만 더 이상 사용되지 않는 경고를 제공하는 것입니다.

Notification notification = new Notification.Builder(MainActivity.this)
        .setContentTitle("New Message")
        .setContentText("You've received new messages.")
        .setSmallIcon(R.drawable.ic_notify_status)
        .setChannelId(CHANNEL_ID)
        .build();  

알림 개요

내 질문 : 알림을 작성하는 다른 솔루션이 있습니까? 그래도 Android O를 지원합니까?

내가 찾은 해결책은 Notification.Builder 생성자에서 채널 ID를 매개 변수로 전달하는 것입니다. 그러나이 솔루션은 정확하게 재사용 할 수 없습니다.

new Notification.Builder(MainActivity.this, "channel_id")

4
그러나이 솔루션은 정확하게 재사용 할 수 없습니다. 어떻게 요?
Tim

5
NotificationCompat.Builder는 Notification.Builder가 아니라 더 이상 사용되지 않습니다. Compat 부분이 사라졌습니다. 알림은 모든 것을 간소화하는 새로운 수업입니다
Kapil G

1
@ kapsym 그것은 실제로 다른 길입니다. Notification.Builder는 더 오래된
Tim

게다가 나는 여기되지 볼 해달라고 developer.android.com/reference/android/support/v4/app/... . 아마 Lint의 버그
Kapil G

채널 ID는 생성자에 전달되거나을 사용하여 배치 할 수 있습니다 notificationBuild.setChannelId("channel_id"). 필자의 경우이 마지막 솔루션은 NotificationCompat.Builder아이콘, 사운드 및 진동에 대한 매개 변수를 저장하여 몇 가지 방법 으로 재사용 할 때 더 재사용 가능 합니다.
GuilhermeFGL

답변:


167

문서에서 빌더 메소드 NotificationCompat.Builder(Context context)가 더 이상 사용되지 않는다고 언급되어 있습니다. 그리고 channelId매개 변수 가있는 생성자를 사용해야합니다 :

NotificationCompat.Builder(Context context, String channelId)

NotificationCompat.Builder 설명서 :

이 생성자는 API 레벨 26.0.0-beta1에서 더 이상 사용되지 않습니다. NotificationCompat.Builder (Context, String)를 대신 사용하십시오. 게시 된 모든 알림은 NotificationChannel ID를 지정해야합니다.

Notification.Builder 문서 :

이 생성자는 API 레벨 26에서 더 이상 사용되지 않습니다. 대신 Notification.Builder (Context, String)를 사용하십시오. 게시 된 모든 알림은 NotificationChannel ID를 지정해야합니다.

빌더 세터를 재사용하려면을 사용하여 빌더를 작성하고 channelId해당 빌더를 헬퍼 메소드에 전달하고 해당 메소드에서 원하는 설정을 설정할 수 있습니다.


3
Notification.Builder(context)NotificationChannel 세션에 솔루션을 게시 할 때 서로 모순되는 것 같습니다 . 그러나 글쎄, 적어도 당신은이 사용 중단을 알리는 게시물을 발견했습니다 =)
GuilhermeFGL

23
설명 할 수있는 channelId는 무엇입니까?
Santanu Sur

15
channelId는 무엇입니까?
RoundTwo

3
여전히을 사용 NotificationCompat.Builder(Context context)하고 다음과 같이 채널을 지정할 수도 있습니다 .builder.setChannelId(String channelId)
deyanm

36
채널 ID는 임의의 문자열 일 수 있으며 댓글에서 논의하기에는 너무 큽니다. 그러나 알림을 카테고리로 분리하여 사용자가 앱에서 모든 알림을 차단하지 않고 자신이 중요하지 않다고 생각하는 것을 비활성화 할 수 있습니다.
yehyatt

110

여기에 이미지 설명을 입력하십시오

다음은 이전 버전과의 호환성을 갖춘 API LEVEL 26+ 의 모든 Android 버전에 대한 작업 코드입니다 .

 NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(getContext(), "M_CH_ID");

        notificationBuilder.setAutoCancel(true)
                .setDefaults(Notification.DEFAULT_ALL)
                .setWhen(System.currentTimeMillis())
                .setSmallIcon(R.drawable.ic_launcher)
                .setTicker("Hearty365")
                .setPriority(Notification.PRIORITY_MAX) // this is deprecated in API 26 but you can still use for below 26. check below update for 26 API
                .setContentTitle("Default notification")
                .setContentText("Lorem ipsum dolor sit amet, consectetur adipiscing elit.")
                .setContentInfo("Info");

NotificationManager notificationManager = (NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(1, notificationBuilder.build());

최대 우선 순위를 설정하기위한 API 26 업데이트

    NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    String NOTIFICATION_CHANNEL_ID = "my_channel_id_01";

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "My Notifications", NotificationManager.IMPORTANCE_MAX);

        // Configure the notification channel.
        notificationChannel.setDescription("Channel description");
        notificationChannel.enableLights(true);
        notificationChannel.setLightColor(Color.RED);
        notificationChannel.setVibrationPattern(new long[]{0, 1000, 500, 1000});
        notificationChannel.enableVibration(true);
        notificationManager.createNotificationChannel(notificationChannel);
    }


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

    notificationBuilder.setAutoCancel(true)
            .setDefaults(Notification.DEFAULT_ALL)
            .setWhen(System.currentTimeMillis())
            .setSmallIcon(R.drawable.ic_launcher)
            .setTicker("Hearty365")
       //     .setPriority(Notification.PRIORITY_MAX)
            .setContentTitle("Default notification")
            .setContentText("Lorem ipsum dolor sit amet, consectetur adipiscing elit.")
            .setContentInfo("Info");

    notificationManager.notify(/*notification id*/1, notificationBuilder.build());

앱의 화면이나 다른 앱의 경우 실제로 알림을 표시하려면 어떻게해야합니까?
BlueBoy

@BlueBoy 질문이 없습니다. 정확히 필요한 것이 무엇인지 설명해 주시겠습니까?
Aks4125 4

@ Aks4125 알림이 아래로 미끄러 져 화면 상단에 표시되지 않습니다. 신호음이 들리고 상태 표시 줄에 작은 알림 아이콘이 나타나지만 txt 메시지가 표시되는 것처럼 아무것도 미끄러 져 표시되지 않습니다.
BlueBoy

@BlueBoy는 해당 동작에 대해 우선 순위를 높음으로 설정해야합니다. 이 코드를 업데이트해야하는지 알려주십시오. 우선 순위가 높은 알림을 위해 몰래 들어가면 답을 얻을 수 있습니다.
Aks4125

2
@BlueBoy는 업데이트 된 답변을 확인하십시오. 26 API를 타겟팅하지 않는 경우 동일한 코드를 .setPriority(Notification.PRIORITY_MAX)사용 하고 그렇지 않으면 26 API에 대해 업데이트 된 코드를 사용하십시오. `
Aks4125

31

2-arg 생성자 호출 : Android O와의 호환성을 위해 support-v4를 호출하십시오 NotificationCompat.Builder(Context context, String channelId). Android N 또는 이전 버전에서 실행하는 경우 channelId는 무시됩니다. Android O에서 실행할 때 NotificationChannel동일한로를 만듭니다 channelId.

오래된 샘플 코드 : Notification.Builder 호출 과 같은 여러 JavaDoc 페이지의 샘플 코드new Notification.Builder(mContext) 가 오래되었습니다.

사용되지 않는 생성자 : Notification.Builder(Context context)V4는 NotificationCompat.Builder(Context context) 찬성되지 않습니다 Notification[Compat].Builder(Context context, String channelId). ( Notification.Builder (android.content.Context) 및 v4 NotificationCompat.Builder (컨텍스트 컨텍스트)를 참조하십시오. .)

더 이상 사용되지 않는 클래스 : 전체 클래스 v7 NotificationCompat.Builder 이 더 이상 사용되지 않습니다. ( v7 NotificationCompat.Builder 참조 ) 이전에는 v7 NotificationCompat.Builder을 지원해야했습니다 NotificationCompat.MediaStyle. 안드로이드 O에서는 V4있다 NotificationCompat.MediaStyle에서 미디어의 compat 라이브러리android.support.v4.media패키지. 필요한 경우 사용하십시오MediaStyle .

API 14+ : 26.0.0 이상의 지원 라이브러리에서 support-v4 및 support-v7 패키지는 모두 최소 API 레벨 14를 지원합니다. v # 이름은 과거입니다.

최근 지원 라이브러리 개정을 참조하십시오 .


22

Build.VERSION.SDK_INT >= Build.VERSION_CODES.O많은 답변이 제안 하는 대신 약간 더 간단한 방법이 있습니다.

Android 문서 에서 Firebase 클라우드 메시징 클라이언트 앱 설정에 설명 된대로 AndroidManifest.xml 파일 application섹션에 다음 행을 추가하십시오 .

    <meta-data
        android:name="com.google.firebase.messaging.default_notification_channel_id" 
        android:value="@string/default_notification_channel_id" />

그런 다음 values ​​/ strings.xml 파일에 채널 이름이있는 행을 추가 하십시오.

<string name="default_notification_channel_id">default</string>

그런 다음 2 개의 매개 변수가 있는 새로운 버전의 NotificationCompat.Builder 생성자 를 사용할 수 있습니다 (1 매개 변수가있는 이전 생성자는 Android Oreo에서 더 이상 사용되지 않기 때문에).

private void sendNotification(String title, String body) {
    Intent i = new Intent(this, MainActivity.class);
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent pi = PendingIntent.getActivity(this,
            0 /* Request code */,
            i,
            PendingIntent.FLAG_ONE_SHOT);

    Uri sound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

    NotificationCompat.Builder builder = new NotificationCompat.Builder(this, 
        getString(R.string.default_notification_channel_id))
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentTitle(title)
            .setContentText(body)
            .setAutoCancel(true)
            .setSound(sound)
            .setContentIntent(pi);

    NotificationManager manager = 
        (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    manager.notify(0, builder.build());
}

1
이것은 어떻게 더 간단합니까? : S
Nactus

17

다음은 Android Oreo에서 작동하며 Oreo보다 적은 샘플 코드입니다.

  NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
            NotificationCompat.Builder builder = null;
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
                int importance = NotificationManager.IMPORTANCE_DEFAULT;
                NotificationChannel notificationChannel = new NotificationChannel("ID", "Name", importance);
                notificationManager.createNotificationChannel(notificationChannel);
                builder = new NotificationCompat.Builder(getApplicationContext(), notificationChannel.getId());
            } else {
                builder = new NotificationCompat.Builder(getApplicationContext());
            }

            builder = builder
                    .setSmallIcon(R.drawable.ic_notification_icon)
                    .setColor(ContextCompat.getColor(context, R.color.color))
                    .setContentTitle(context.getString(R.string.getTitel))
                    .setTicker(context.getString(R.string.text))
                    .setContentText(message)
                    .setDefaults(Notification.DEFAULT_ALL)
                    .setAutoCancel(true);
            notificationManager.notify(requestCode, builder.build());

8

간단한 샘플

    public void showNotification (String from, String notification, Intent intent) {
        PendingIntent pendingIntent = PendingIntent.getActivity(
                context,
                Notification_ID,
                intent,
                PendingIntent.FLAG_UPDATE_CURRENT
        );


        String NOTIFICATION_CHANNEL_ID = "my_channel_id_01";
        NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);


        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "My Notifications", NotificationManager.IMPORTANCE_DEFAULT);

            // Configure the notification channel.
            notificationChannel.setDescription("Channel description");
            notificationChannel.enableLights(true);
            notificationChannel.setLightColor(Color.RED);
            notificationChannel.setVibrationPattern(new long[]{0, 1000, 500, 1000});
            notificationChannel.enableVibration(true);
            notificationManager.createNotificationChannel(notificationChannel);
        }


        NotificationCompat.Builder builder = new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID);
        Notification mNotification = builder
                .setContentTitle(from)
                .setContentText(notification)

//                .setTicker("Hearty365")
//                .setContentInfo("Info")
                //     .setPriority(Notification.PRIORITY_MAX)

                .setContentIntent(pendingIntent)

                .setAutoCancel(true)
//                .setDefaults(Notification.DEFAULT_ALL)
//                .setWhen(System.currentTimeMillis())
                .setSmallIcon(R.mipmap.ic_launcher)
                .setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher))
                .build();

        notificationManager.notify(/*notification id*/Notification_ID, mNotification);

    }

4
Notification notification = new Notification.Builder(MainActivity.this)
        .setContentTitle("New Message")
        .setContentText("You've received new messages.")
        .setSmallIcon(R.drawable.ic_notify_status)
        .setChannelId(CHANNEL_ID)
        .build();  

올바른 코드는 다음과 같습니다.

Notification.Builder notification=new Notification.Builder(this)

종속성 26.0.1 및 28.0.0과 같은 새로운 업데이트 된 종속성

일부 사용자는이 코드를 다음 형식으로 사용합니다.

Notification notification=new NotificationCompat.Builder(this)//this is also wrong code.

따라서 논리는 어떤 메소드를 선언하거나 초기화 한 다음 오른쪽의 동일한 메소드가 할당에 사용된다는 것입니다. Leftside of =에 어떤 방법을 사용한다면, 새로운 방법으로 Allocation에 동일한 방법이 =의 오른쪽에 사용됩니다.

이 코드를 사용해보십시오 ... 확실히 작동합니다


1

이 생성자는 API 레벨 26.1.0에서 더 이상 사용되지 않습니다. NotificationCompat.Builder (Context, String)를 대신 사용하십시오. 게시 된 모든 알림은 NotificationChannel ID를 지정해야합니다.


오히려 cat 복사 및 답변으로 게시하는 대신 문서 링크가 포함 된 주석을 추가하십시오.
JacksOnF1re 14

0
  1. Notification_Channel_ID로 알림 채널을 선언해야합니다.
  2. 해당 채널 ID로 알림을 작성하십시오. 예를 들어

...
 public static final String NOTIFICATION_CHANNEL_ID = MyLocationService.class.getSimpleName();
...
...
NotificationChannel channel = new NotificationChannel(NOTIFICATION_CHANNEL_ID,
                NOTIFICATION_CHANNEL_ID+"_name",
                NotificationManager.IMPORTANCE_HIGH);

NotificationManager notifManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

notifManager.createNotificationChannel(channel);


NotificationCompat.Builder builder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID)
                .setContentTitle(getString(R.string.app_name))
                .setContentText(getString(R.string.notification_text))
                .setOngoing(true)
                .setContentIntent(broadcastIntent)
                .setSmallIcon(R.drawable.ic_tracker)
                .setPriority(PRIORITY_HIGH)
                .setCategory(Notification.CATEGORY_SERVICE);

        startForeground(1, builder.build());
...
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.