নোটিফিকেশনকম্প্যাট.বিল্ডার অ্যান্ড্রয়েড ও-এ অবনতি হয়েছে


161

আমার প্রকল্পটি অ্যান্ড্রয়েড ও- তে আপগ্রেড করার পরে

buildToolsVersion "26.0.1"

অ্যান্ড্রয়েড স্টুডিওতে থাকা লিন্ট অনুসরণ নোটিফিকেশন বিল্ডার পদ্ধতির জন্য অবহেলিত সতর্কতা দেখাচ্ছে:

new NotificationCompat.Builder(context)

সমস্যা হল: অ্যান্ড্রয়েড বিকাশকারীরা তাঁদের নথিপত্র বর্ণনা আপডেট 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();  

বিজ্ঞপ্তি ওভারভিউ

আমার প্রশ্ন: নোটিফিকেশন তৈরির জন্য কি অন্য কোনও সমাধান রয়েছে, এবং এখনও অ্যান্ড্রয়েড ওকে সমর্থন করে?

আমি যে সমাধানটি পেয়েছি তা হ'ল নোটিফিকেশন u বিল্ডার কনস্ট্রাক্টরের প্যারামিটার হিসাবে চ্যানেল আইডি পাস করা। তবে এই সমাধানটি একেবারে পুনরায় ব্যবহারযোগ্য নয়।

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

4
তবে এই সমাধানটি একেবারে পুনরায় ব্যবহারযোগ্য নয়। তা কিভাবে?
টিম

5
বিজ্ঞপ্তি.কম্প্যাট.বিল্ডার অবহিত করা হয়েছে বিজ্ঞপ্তি নয় u বিল্ডার। কমপ্যাট অংশ চলে গেছে লক্ষ্য করুন। বিজ্ঞপ্তিটি তাদের নতুন শ্রেণি যেখানে তারা সবকিছু
কপিল জি

1
@ কেপসিম এটি আসলে অন্যভাবে। বিজ্ঞপ্তি.বিল্ডার বয়স্ক
টিম

প্লাস আমি তা এখানে অবচিত দেখতে developer.android.com/reference/android/support/v4/app/... । লিন্টে একটি বাগ হতে পারে
কপিল জি

চ্যানেল আইডিটি কনস্ট্রাক্টরে পাস করা হয়েছে, বা ব্যবহার করে স্থাপন করা যেতে পারে notificationBuild.setChannelId("channel_id")NotificationCompat.Builderআইকন, শব্দ এবং কম্পনের জন্য প্যারামিটারগুলি সঞ্চয় করে কয়েকটি পদ্ধতিতে আমার পুনরায় ব্যবহার করা হওয়ায় আমার ক্ষেত্রে এই শেষ সমাধানটি পুনরায় সক্ষম করা হয়েছে।
গিলহেরেমএফজিএল

উত্তর:


167

ডকুমেন্টেশনে এটি উল্লেখ NotificationCompat.Builder(Context context)করা হয়েছে যে নির্মাতা পদ্ধতিটি অবচয় করা হয়েছে। এবং আমাদের কনস্ট্রাক্টরটি ব্যবহার করতে হবে যার channelIdপ্যারামিটার রয়েছে:

NotificationCompat.Builder(Context context, String channelId)

নোটিফিকেশনকম্প্যাট.বিল্ডার ডকুমেন্টেশন:

এই কনস্ট্রাক্টরটি এপিআই স্তরের 26.0.0-beta1 এ অবচয় করা হয়েছিল। পরিবর্তে NotificationsCompat.Builder (প্রসঙ্গ, স্ট্রিং) ব্যবহার করুন। সমস্ত পোস্ট বিজ্ঞপ্তি একটি নোটিফিকেশন চ্যানেল আইডি নির্দিষ্ট করতে হবে।

বিজ্ঞপ্তি.বিল্ডার ডকুমেন্টেশন:

এই কনস্ট্রাক্টরটি এপিআই 26 স্তরে অবনতি হয়েছে instead পরিবর্তে Notifications.Builder (প্রসঙ্গ, স্ট্রিং) ব্যবহার করুন। সমস্ত পোস্ট বিজ্ঞপ্তি একটি নোটিফিকেশন চ্যানেল আইডি নির্দিষ্ট করতে হবে।

আপনি যদি বিল্ডার সেটারগুলি পুনরায় ব্যবহার করতে চান তবে আপনি বিল্ডারটি এর সাহায্যে তৈরি করতে পারেন channelIdএবং সেই বিল্ডারকে কোনও সহায়ক পদ্ধতিতে পাস করতে পারেন এবং সেই পদ্ধতিতে আপনার পছন্দসই সেটিংস সেট করতে পারেন।


3
Notification.Builder(context)নোটিফিকেশন চ্যানেল সেশনে সমাধান পোস্ট করার সময় তারা নিজেরাই বিরোধিতা করছে বলে মনে হচ্ছে । তবে ভাল, কমপক্ষে আপনি এই পোস্টটিকে অবহেলা করে বলে একটি পোস্ট পেয়েছেন =)
গিলহেরেমএফজিএল

23
চ্যানেলআইডি কী আপনি দয়া করে ব্যাখ্যা করতে পারেন?
সন্তানু সুর

15
চ্যানেলআইডি কি?
রাউন্ডটো দুই

3
আপনি এখনও ব্যবহার করতে পারেন NotificationCompat.Builder(Context context)এবং তারপরে চ্যানেলটি এমনভাবে বরাদ্দ করতে পারেন:builder.setChannelId(String channelId)
ডায়ানম

36
একটি চ্যানেল আইডি যে কোনও স্ট্রিং হতে পারে, মন্তব্যগুলিতে আলোচনার জন্য এটি খুব বড়, তবে এটি আপনার বিজ্ঞপ্তিগুলিকে বিভাগগুলিতে পৃথক করার জন্য ব্যবহৃত হয় যাতে ব্যবহারকারী আপনার অ্যাপ থেকে সমস্ত বিজ্ঞপ্তিগুলি অবরুদ্ধ করার পরিবর্তে তার জন্য গুরুত্বপূর্ণ নয় এমনটি তার অক্ষম করতে পারে।
ইহাইয়াত

110

এখানে চিত্র বর্ণনা লিখুন

পশ্চাদগম্য সামঞ্জস্যের সাথে API লেভেল 26+ হিসাবে সমস্ত অ্যান্ড্রয়েড সংস্করণগুলির জন্য এখানে কোডিং কাজ করছে ।

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

সর্বোচ্চ অগ্রাধিকার সেট করতে এপিআই 26 এর জন্য আপডেট DATE

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

আপনি কীভাবে বিজ্ঞপ্তিটি অ্যাপে বা অন্য কোনও অ্যাপে স্ক্রিনে প্রদর্শন করতে পারেন?
ব্লুবয়

@ ব্লুবয় আমি আপনার প্রশ্নটি পাচ্ছি না। আপনি ঠিক কি প্রয়োজন দয়া করে ব্যাখ্যা করতে পারেন?
Aks4125

@ Aks4125 বিজ্ঞপ্তিটি নীচে সরবে না এবং স্ক্রিনের শীর্ষে প্রদর্শিত হবে না। আপনি একটি শোনেন, এবং একটি ছোট বিজ্ঞপ্তি আইকনটি স্ট্যাটাস বারে উপস্থিত হয় - তবে কিছুই স্লাইড হয় না এবং দেখায় যে আপনি কোনও টেক্সট বার্তা পেয়েছেন কিনা।
ব্লুবয়

@ ব্লুবয় আপনাকে সেই আচরণের জন্য হাই উচ্চতায় অগ্রাধিকার নির্ধারণ করতে হবে। আপনার এই কোডটি আপডেট করার প্রয়োজন হলে আমাকে জানান। উচ্চ অগ্রাধিকারের বিজ্ঞপ্তির জন্য আপনি যদি ঘুরে দেখেন তবে আপনার উত্তর পাবেন।
Aks4125

2
@ ব্লুবয় আপডেট উত্তর দেখুন। যদি আপনি 26 টি এপিআই লক্ষ্যবস্তু না করে থাকেন তবে কেবল একই কোডটি .setPriority(Notification.PRIORITY_MAX)ব্যবহার করুন অন্যথায় 26 এপিআইয়ের জন্য আপডেট কোড ব্যবহার করুন। `
Aks4125

31

2-আরগ নির্মাণকারীকে কল করুন: অ্যান্ড্রয়েড ওয়ের সাথে সামঞ্জস্য করার জন্য, সাপোর্ট-ভি 4 কল করুন NotificationCompat.Builder(Context context, String channelId)। অ্যান্ড্রয়েড এন বা তার আগে চলমান চলাকালীন, channelIdএড়ানো হবে। যখন অ্যান্ড্রয়েড হে চালু রাখার জন্য, একটি তৈরি NotificationChannelএকই সঙ্গে channelId

পুরানো নমুনা কোড: বেশ কয়েকটি জাভাক ডক পৃষ্ঠাগুলির নমুনা কোড যেমন বিজ্ঞপ্তি B বিল্ডার কলিংয়ের new Notification.Builder(mContext)মেয়াদ শেষ of

অবহেলিত কনস্ট্রাক্টর: Notification.Builder(Context context) এবং v4 NotificationCompat.Builder(Context context) এর পক্ষে হ্রাস করা হয়েছে Notification[Compat].Builder(Context context, String channelId)। ( বিজ্ঞপ্তি দেখুন। বিল্ডার (android.content.Context) এবং v4 নোটিফিকেশন কমপ্যাট.বিল্ডার (প্রসঙ্গ প্রসঙ্গ) ।)

অবজ্ঞাত শ্রেণি: সম্পূর্ণ শ্রেণি v7 হ্রাস NotificationCompat.Builder করা হয়েছে। (দেখুন ভি 7 নোটিফিকেশন.কমার্ডবিল্ডার ।) পূর্বে, ভি 7 NotificationCompat.Builderসমর্থন করার প্রয়োজন ছিল NotificationCompat.MediaStyle। অ্যান্ড্রয়েড হে, একটি V4 এর NotificationCompat.MediaStyleমধ্যে মিডিয়া-compat গ্রন্থাগার এর android.support.v4.mediaপ্যাকেজ। আপনার প্রয়োজন হলে এটি ব্যবহার করুন MediaStyle

এপিআই 14+: 26.0.0 এবং উচ্চতর থেকে সাপোর্ট লাইব্রেরিতে, সমর্থন-ভি 4 এবং সমর্থন-ভি 7 প্যাকেজগুলি উভয়ই ন্যূনতম API স্তরের 14 সমর্থন করে। ভি # নামগুলি historicalতিহাসিক।

দেখুন সাম্প্রতিক কালে সহায়তা চেয়ে লাইব্রেরী পুনর্বিবেচনা


22

যতগুলি Build.VERSION.SDK_INT >= Build.VERSION_CODES.Oউত্তর প্রস্তাব দেয় সেগুলি পরীক্ষা করার পরিবর্তে কিছুটা সহজ উপায় আছে -

অ্যান্ড্রয়েড ডকটিতে ফায়ারবেস ক্লাউড মেসেজিং ক্লায়েন্ট অ্যাপ সেটআপে বর্ণিত হিসাবে অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএল ফাইলের applicationবিভাগে নিম্নলিখিত লাইনটি যুক্ত করুন :

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

তারপরে মান / স্ট্রিং.এক্সএমএল ফাইলটিতে একটি চ্যানেলের নামের সাথে একটি লাইন যুক্ত করুন:

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

এর পরে আপনি 2 পরামিতি সহ নোটিফিকেশন কমপ্যাট বিল্ডার কনস্ট্রাক্টরের নতুন সংস্করণটি ব্যবহার করতে সক্ষম হবেন (যেহেতু অ্যান্ড্রয়েড ওরিওতে 1 টি প্যারামিটার সহ পুরানো কনস্ট্রাক্টর অবনতি হয়েছে):

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
এই সহজ কিভাবে? : এস
ন্যাকটাস

17

এখানে নমুনা কোড রয়েছে যা অ্যান্ড্রয়েড ওরিওতে কাজ করছে এবং ওরিওর চেয়ে কম।

  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.

সুতরাং লজিক হ'ল আপনি যে পদ্ধতিটি ঘোষণা করবেন বা শুরু করবেন তারপরে ডানদিকে একই মেথোড বরাদ্দকরণের জন্য ব্যবহৃত হবে। যদি লেফটসাইডে = আপনি কিছু পদ্ধতি ব্যবহার করবেন তবে একই পদ্ধতিটি নতুন দিয়ে বরাদ্দকরণের জন্য = এর ডানদিকে ব্যবহার করা হবে।

এই কোডটি চেষ্টা করে দেখুন ... এটি অবশ্যই কাজ করবে


1

এই কনস্ট্রাক্টরটি এপিআই স্তরের 26.1.0 তে অবহেলা করা হয়েছিল। পরিবর্তে NotificationsCompat.Builder (প্রসঙ্গ, স্ট্রিং) ব্যবহার করুন। সমস্ত পোস্ট বিজ্ঞপ্তি একটি নোটিফিকেশন চ্যানেল আইডি নির্দিষ্ট করতে হবে।


কপির বিড়ালের পরিবর্তে এবং উত্তর হিসাবে পোস্ট করার পরিবর্তে ডকুমেন্টেশনে লিঙ্ক সহ একটি মন্তব্য যুক্ত করুন।
জ্যাকসঅনএফ 1 ই

0
  1. বিজ্ঞপ্তি_চ্যানেল_আইডি সহ একটি বিজ্ঞপ্তি চ্যানেল ঘোষণা করা দরকার
  2. সেই চ্যানেল আইডি সহ বিজ্ঞপ্তি তৈরি করুন। উদাহরণ স্বরূপ,

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