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/…。多分リントのバグ
カピル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 2017

23
channelIdとは何ですか?
Santanu Sur 2018

15
channelIdとは何ですか?
RoundTwo 2018年

3
あなたはまた、まだ使用することができNotificationCompat.Builder(Context context)、その後、そのようにチャンネルを割り当てる:builder.setChannelId(String channelId)
deyanm

36
チャネルIDは任意の文字列にすることができます。コメントで議論するには大きすぎますが、通知をカテゴリに分類して、ユーザーがアプリからのすべての通知をブロックするのではなく、重要ではないと考えるものを無効にできるようにします。
yehyatt

110

ここに画像の説明を入力してください

以下は、後方互換性を備えたAPIレベル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 2017年

@BlueBoy私はあなたの質問を得ていません。正確に何が必要かを説明してもらえますか?
Aks4125 2017年

@ Aks4125通知は下にスライドせず、画面の上部に表示されません。トーンが聞こえ、小さな通知アイコンがステータスバーに表示されますが、下にスライドして何も表示されず、txtメッセージが表示されます。
BlueBoy 2017年

@BlueBoyは、その動作のために優先度をHIGHに設定する必要があります。このコードを更新する必要がある場合はお知らせください。優先度の高い通知を探して回り込むと、答えが返ってきます。
Aks4125 2017

2
@BlueBoy更新された回答を確認してください。26 APIをターゲットにしていない場合は、同じコードを.setPriority(Notification.PRIORITY_MAX)使用し、それ以外の場合は26 APIの更新されたコードを使用します。`
Aks4125 2017

31

2引数のコンストラクターを呼び出します。AndroidOとの互換性を保つには、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(Context context)を参照してください。)

非推奨クラス:クラスv7 全体NotificationCompat.Builderが非推奨です。(v7 NotificationCompat.Builderを参照してください。)以前は、v7 NotificationCompat.Builderをサポートする必要がありましたNotificationCompat.MediaStyle。Android OではNotificationCompat.MediaStylemedia-compatライブラリandroid.support.v4.mediaパッケージにv4 があります。必要な場合はそれを使用してくださいMediaStyle

API 14以降: 26.0.0以降のサポートライブラリでは、support-v4およびsupport-v7パッケージの両方が最小APIレベル14をサポートしています。v#の名前は過去のものです。

最近のサポートライブラリリビジョンを参照してください。


22

Build.VERSION.SDK_INT >= Build.VERSION_CODES.O多くの回答が示すようにチェックする代わりに、少し簡単な方法があります-

AndroidドキュメントでのFirebase Cloud Messagingクライアントアプリの設定ドキュメントの説明に従ってapplicationAndroidManifest.xmlファイルのセクションに次の行を追加します。

    <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.

したがって、ロジックは、宣言または初期化するメソッドであり、右側の同じメソッドが割り当てに使用されます。=の左側でいくつかのメソッドを使用する場合、同じメソッドが=の右側でnewの割り当てに使用されます。

このコードを試してください...それは確実に機能します


1

このコンストラクタは、APIレベル26.1.0で廃止されました。代わりにNotificationCompat.Builder(Context、String)を使用してください。投稿されたすべての通知は、NotificationChannel IDを指定する必要があります。


多分むしろ猫をコピーして回答として投稿するのではなく、ドキュメントへのリンクを含むコメントを追加します。
JacksOnF1re 2018年

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.