Android O에서 더 이상 사용되지 않는 NotificationCompat.Builder NotificationChannel 을 설명하는 설명서를

프로젝트를 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")


답변

문서에서 빌더 메소드 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해당 빌더를 헬퍼 메소드에 전달하고 해당 메소드에서 원하는 설정을 설정할 수 있습니다.


답변

다음은 이전 버전과의 호환성을 갖춘 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());

답변

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 # 이름은 과거입니다.

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


답변

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());
}

답변

다음은 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());

답변

간단한 샘플

    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);

    }

답변

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에 동일한 방법이 =의 오른쪽에 사용됩니다.

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