web-dev-qa-db-ja.com

NotificationCompat.BuilderはAndroid Oで非推奨になりました

自分のプロジェクトをAndroid Oにアップグレードした後

buildToolsVersion "26.0.1"

Android StudioのLintは、follow通知ビルダーメソッドに対して廃止予定の警告を表示しています。

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")
124
GuilhermeFGL

ドキュメンテーションには、ビルダーメソッドNotificationCompat.Builder(Context context)は推奨されていないと書かれています。そしてchannelIdパラメータを持つコンストラクタを使う必要があります。

NotificationCompat.Builder(Context context, String channelId)

https://developer.Android.com/reference/Android/support/v4/app/NotificationCompat.Builder.html

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

https://developer.Android.com/reference/Android/app/Notification.Builder.html

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

ビルダーセッターを再利用する場合は、channelIdを使用してビルダーを作成し、そのビルダーをヘルパーメソッドに渡して、そのメソッドで好みの設定を設定できます。

119
Bob

enter image description here

これは、 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());
95
Aks4125

2引数のコンストラクタを呼び出します。 Android Oとの互換性のために、support-v4 NotificationCompat.Builder(Context context, String channelId)を呼び出します。 Android N以前で実行している場合、channelIdは無視されます。 Android O上で実行するときは、同じNotificationChannelを持つchannelIdも作成します。

期限切れのサンプルコード: Notification.Builder _ new Notification.Builder(mContext)の呼び出しなど、いくつかのJavaDocページのサンプルコードは期限切れです。

非推奨のコンストラクタ: 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 を参照。)以前は、NotificationCompat.Builderをサポートするにはv7 NotificationCompat.MediaStyleが必要でした。 Android Oでは、 media-compat libraryNotificationCompat.MediaStyleパッケージにv4 Android.support.v4.mediaがあります。 MediaStyleが必要な場合はそれを使ってください。

API 14以降: 26.0.0以降のサポートライブラリでは、support-v4とsupport-v7の両方のパッケージで最小14のAPIレベルがサポートされます。v#の名前は歴史的なものです。

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

27
Jerry101

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

AndroidでFirebase Cloudメッセージングクライアントアプリケーションを設定する docの説明に従って、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>

その後、新しいバージョンの NotificationCompat.Builder コンストラクタを2つのパラメータで使用できるようになります(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());
}
18

これが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());
13
Arpit

簡単なサンプル

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

    }
6
Mehul
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.

そのため、Logicは、どちらのメソッドを宣言または初期化するか、そして右側の同じコードがAllocationに使用されることになります。 =の左辺では何らかの方法を使用するでしょう。そして同じ方法が=の右側でnewとの割り当てに使用されます。

このコードを試してください...それは確かにうまくいくでしょう

2
Pradeep Sheoran

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

1
Sandeep Singh