নতুন ফায়ারবেস ক্লাউড মেসেজিং সিস্টেমের সাথে বিজ্ঞপ্তি আইকন


132

গতকাল গুগল নতুন ফায়ারবেসের উপর ভিত্তি করে নতুন বিজ্ঞপ্তি সিস্টেমটি গুগল আই / ও-তে উপস্থাপন করেছে। আমি এই নতুন এফসিএম (ফায়ারবেস ক্লাউড মেসেজিং) গিথুবের উদাহরণ দিয়ে চেষ্টা করেছি।

বিজ্ঞপ্তির আইকনটি আমি একটি নির্দিষ্ট অঙ্কনীয় ঘোষিত সত্ত্বেও সর্বদা আই- ল্যাঞ্চার is

কেন? বার্তাটি পরিচালনা করার জন্য অফিসিয়াল কোডের নীচে এখানে

public class AppFirebaseMessagingService extends FirebaseMessagingService {

    /**
     * Called when message is received.
     *
     * @param remoteMessage Object representing the message received from Firebase Cloud Messaging.
     */
    // [START receive_message]
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        // If the application is in the foreground handle both data and notification messages here.
        // Also if you intend on generating your own notifications as a result of a received FCM
        // message, here is where that should be initiated. See sendNotification method below.
        sendNotification(remoteMessage);
    }
    // [END receive_message]

    /**
     * Create and show a simple notification containing the received FCM message.
     *
     * @param remoteMessage FCM RemoteMessage received.
     */
    private void sendNotification(RemoteMessage remoteMessage) {

        Intent intent = new Intent(this, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
                PendingIntent.FLAG_ONE_SHOT);

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

// this is a my insertion looking for a solution
        int icon = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? R.drawable.myicon: R.mipmap.myicon;
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(icon)
                .setContentTitle(remoteMessage.getFrom())
                .setContentText(remoteMessage.getNotification().getBody())
                .setAutoCancel(true)
                .setSound(defaultSoundUri)
                .setContentIntent(pendingIntent);

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

        notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
    }

}

আপনি কীভাবে বিজ্ঞপ্তিটি তৈরি করছেন তার সাথে ফায়ারবেসের কোনও সম্পর্ক নেই, দয়া করে আপনি যা দেখছেন তা চিত্র সরবরাহ করুন
tyczj

1
সঠিক। এই কোডটি সরাসরি ফায়ারবেস থেকে আসে এবং সেন্ডনোটিকেশন () পদ্ধতিটি কোনও বিজ্ঞপ্তির জন্য হুবহু একই। এই কোডটি জিসিএমের সাথে সূক্ষ্মভাবে কাজ করে তবে এফসিএম নং সহ। এটা সবসময় ic_launcher থাকে, নতুন ওয়েব ইন্টারফেস ব্যবহার করে বার্তা পাঠাতে
মার্কো

আপনি ছোট আইকনটি সেট করেছেন তবে বড় আইকন নয়, আপনি পুশ
পেডে

অ্যাপ্লিকেশনটি অগ্রভাগে থাকা অবস্থায় এটি কী আপনার কাস্টম বিজ্ঞপ্তি আইকনটি দেখায়? সেটা আমার জন্য কাজ করে. যাইহোক, অ্যাপটি ব্যাকগ্রাউন্ডে থাকা অবস্থায় এটি অবশ্যই কিছু প্রকারের ডিফল্ট এফসিএম হ্যান্ডলার ব্যবহার করবে, যেহেতু সমস্ত বিজ্ঞপ্তি সেটিংস উপেক্ষা করা হবে (আইকন, শব্দ, লাইট, ভাইব্রেট ইত্যাদি কাস্টমাইজ করা যায় না)।
শিনিপেনগুইন

উত্তর:


267

দুর্ভাগ্যক্রমে এটি এসডিকে 9.0.0-9.6.1 এ ফায়ারবেস বিজ্ঞপ্তিগুলির একটি সীমাবদ্ধতা ছিল। অ্যাপটি ব্যাকগ্রাউন্ডে থাকলে কনসোল থেকে প্রেরিত বার্তাগুলির জন্য লঞ্চ আইকনটি ম্যানিফেস্ট থেকে (প্রয়োজনীয় অ্যান্ড্রয়েড টিংটিং সহ) ব্যবহার করা হয়।

এসডিকে 9.8.0 এর সাথে, আপনি ডিফল্টটিকে ওভাররাইড করতে পারেন! আপনার অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএলে আপনি আইকন এবং রঙটি কাস্টমাইজ করতে নিম্নলিখিত ক্ষেত্রগুলি সেট করতে পারেন:

<meta-data
        android:name="com.google.firebase.messaging.default_notification_icon"
        android:resource="@drawable/notification_icon" />
<meta-data android:name="com.google.firebase.messaging.default_notification_color"
        android:resource="@color/google_blue" />

নোট করুন অ্যাপ্লিকেশনটি অগ্রভাগে থাকলে (বা কোনও ডেটা বার্তা প্রেরণ করা হয়) আপনি ডিসপ্লেটি কাস্টমাইজ করতে আপনার নিজস্ব যুক্তিটি সম্পূর্ণরূপে ব্যবহার করতে পারেন। HTTP / XMPP API গুলি থেকে বার্তা প্রেরণ করা থাকলে আপনি সর্বদা আইকনটি কাস্টমাইজ করতে পারেন।


1
@ আইয়ান নাপিত: অদূর ভবিষ্যতে এই আচরণ পরিবর্তন করার জন্য গুগলে কোনও পরিকল্পনা আছে?
স্কাইলভ

1
দলটি বিষয়টি সম্পর্কে অবগত এবং একটি সমাধানের জন্য কাজ করছে।
আর্থার থম্পসন

1
এ সম্পর্কে কোন আপডেট? ভেবেছিলাম আমি জিজ্ঞাসা করব কারণ এমন একটি পরিস্থিতিতে রয়েছে যখন কোনও গুগল ইঞ্জিনিয়ার প্যাচটি চাপতে ভুলে গিয়েছিল।
সিকিউএম

7
আহ, আমি এটি 9.8.0 এর সাথে কাজ করতে পেরেছি। অন্যকে সহায়তা করতে, আপনার স্ট্যাটাস বারের আইকনটি অবশ্যই প্রয়োজনীয়তার সাথে বেঁচে থাকতে হবে: ডেভেলপার.অ্যান্ড্রয়েড . com/ guide/ practices/ ui_guidlines/… । মাইনটি না এবং তাই ম্যানিফেস্টে উল্লিখিত আইকনটি ব্যবহার না করে ফায়ারবেস কেবল স্ট্যান্ডার্ড হোয়াইটস্কয়েরের ডিফল্ট হয়েছিল।
জাফরুন

3
যদি আপনি এটি চেষ্টা করে দেখতে পান এবং আইকনটি অন্যান্য বিজ্ঞপ্তির চেয়ে ছোট, তবে নিশ্চিত হয়ে নিন যে আপনি কোনও ভেক্টর আঁকতে সক্ষম (এবং কোনও পিএনজি নয়) ব্যবহার করছেন। এটা আমার জন্য এটি সমাধান।
রিপার

35

আপনার ক্লায়েন্ট এবং ব্যবহার করা বার্তা পাঠাতে একটি সার্ভার বাস্তবায়ন ব্যবহার করুন ডাটা বদলে বার্তা ধরণ প্রজ্ঞাপন বার্তা প্রকার।

এটি onMessageReceivedআপনার অ্যাপ্লিকেশনটি ব্যাকগ্রাউন্ডে বা অগ্রভাগে থাকলে নির্বিশেষে একটি কলব্যাক পেতে সহায়তা করবে এবং আপনি যদি নিজের কাস্টম বিজ্ঞপ্তিটি তৈরি করতে পারেন তবে


2
এটি ফায়ারবেস ডক্সেও প্রস্তাবিত সমাধান, আপনি যদি নোটিফিকেশনের পরিবর্তে ডেটা পুশের উপর নির্ভর করেন তবে আপনি যে কোনও উপায়ে পছন্দ করতে পারেন বিজ্ঞপ্তিটি প্রদর্শন করতে পারেন।
র্যাকগুলি

1
হ্যাঁ একমত. এটি একটি সঠিক উত্তর হিসাবে চিহ্নিত করা উচিত। বা আমার উত্তর নীচে :)
বিকাশ

3
না, যাঁরা অন্যান্য ক্লায়েন্ট / উত্তরাধিকার সংস্করণগুলির সাথে সামঞ্জস্যতা বজায় রাখতে চান তাদের পক্ষে এটি সম্ভব নয় ible
গ্যাবার

আমাদের উত্পাদিত অ্যাপস রয়েছে যা ইতিমধ্যে একটি বিজ্ঞপ্তি ধরণের ধাক্কা আশা করে এবং আমরা নতুন ক্লায়েন্টদের জন্য ডেটা যুক্ত করার জন্য (জটিল) ব্যাকএন্ড উপাদানটি প্রসারিত করেছি। তবে আমরা আমাদের অ্যাপ্লিকেশনটির উত্তরাধিকার সংস্করণগুলির জন্য সমর্থন সরাতে পারি না।
গ্যাবর

ওহ আমি রাজি। সেটা আর একটি সমস্যা। আমি সংহত করার আগে ডকগুলি পুরোপুরি পড়ার পরামর্শ দেব। উত্পাদনে ছাড়ার আগে ভালভাবে পরীক্ষা করাও। অ্যাপটি চালু হওয়ার আগে ভালভাবে পরীক্ষা করা হলে বিষয়টি এড়ানো যেত could যাইহোক, আপনার কিছু শেখার ছিল।
geekoraul

9

এটিএম তারা এই ইস্যুতে কাজ করছেন https://github.com/firebase/quickstart-android/issues/4

আপনি যখন ফায়ারবেস কনসোল থেকে কোনও বিজ্ঞপ্তি প্রেরণ করেন তখন ডিফল্টরূপে আপনার অ্যাপ্লিকেশন আইকনটি ব্যবহার করা হয় এবং বিজ্ঞপ্তি বারে অ্যান্ড্রয়েড সিস্টেম সেই আইকনটিকে সাদাকালো করে তোলে।

আপনি যদি সেই ফলাফল থেকে অসন্তুষ্ট হন তবে আপনার কোনও বার্তা পাওয়ার সময় ফায়ারব্যাস মেসেজিং সার্ভিসটি প্রয়োগ করা উচিত এবং ম্যানুয়ালি বিজ্ঞপ্তি তৈরি করা উচিত। আমরা এটির উন্নতি করার পথে কাজ করছি তবে আপাতত এটাই একমাত্র উপায়।

সম্পাদনা করুন: এসডিকে 9.8.0 সহ অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএল যুক্ত করুন

<meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/my_favorite_pic"/>

মার্শমেলোতে কীভাবে কাস্টমাইজড আইকন নোটিফিকেশন ট্রে প্রদর্শন করবেন
হর্ষ

6

আমার সমাধান এটিমের মতো একটি, তবে কার্যকর করা সহজ। আপনার কোনও ক্লাস তৈরি করার দরকার নেই যা ফায়ারবেসম্যাসেজিং সার্ভিসকে সম্পূর্ণরূপে ছায়া দেয়, আপনি কেবল ইন্টেন্টটি প্রাপ্ত পদ্ধতিটি (যা সর্বজনীন, কমপক্ষে 9.6.1 সংস্করণে প্রাপ্ত) পদ্ধতিটি ওভাররাইড করতে পারেন এবং অতিরিক্তগুলি থেকে তথ্য প্রদর্শিত হতে পারে। "হ্যাকি" অংশটি হ'ল পদ্ধতিটির নামটি প্রকৃতপক্ষে অপ্রচলিত এবং প্রতিবার আপনি ফায়ারবেস এসডিকে একটি নতুন সংস্করণে আপডেট করবেন, তবে অ্যান্ড্রয়েড স্টুডিওর সাথে ফায়ারবেসমেজেসিং সার্ভিসটি পরীক্ষা করে এবং এটি পাবলিক পদ্ধতির সন্ধানের জন্য আপনি এটি দ্রুত দেখতে পারেন একমাত্র পরামিতি হিসাবে একটি উদ্দেশ্য। 9.6.1 সংস্করণে এটিকে zzm বলা হয়। আমার পরিষেবাটি কেমন দেখাচ্ছে তা এখানে:

public class MyNotificationService extends FirebaseMessagingService {

    public void onMessageReceived(RemoteMessage remoteMessage) {
        // do nothing
    }

    @Override
    public void zzm(Intent intent) {
        Intent launchIntent = new Intent(this, SplashScreenActivity.class);
        launchIntent.setAction(Intent.ACTION_MAIN);
        launchIntent.addCategory(Intent.CATEGORY_LAUNCHER);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* R    equest code */, launchIntent,
                PendingIntent.FLAG_ONE_SHOT);
        Bitmap rawBitmap = BitmapFactory.decodeResource(getResources(),
                R.mipmap.ic_launcher);
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.ic_notification)
                .setLargeIcon(rawBitmap)
                .setContentTitle(intent.getStringExtra("gcm.notification.title"))
                .setContentText(intent.getStringExtra("gcm.notification.body"))
                .setAutoCancel(true)
                .setContentIntent(pendingIntent);

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

        notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
    }
}

জিসিএম.নোটিফিকেশন.কিটি নামের জন্য শিরোনাম সমস্ত সংস্করণের জন্য 100% নিরাপদ?
পেদ্রুও

3

সবেমাত্র টার্গেটএসডিকি ভার্সন 19 এ সেট করুন The বিজ্ঞপ্তি আইকনটি রঙিন হবে। তারপরে ফায়ারবেস এই সমস্যাটি ঠিক করার জন্য অপেক্ষা করুন।


7
: ডি বাহ, তাহলে পার্শ্ব প্রতিক্রিয়াগুলির তালিকা কোথায়?
ইউজেন পেচানেক

@ ইউজেনপ্যাচেনেক হ্যাঁ, বাণিজ্য বন্ধ হ'ল আপনি এমন কিছু এপিআই ব্যবহার করতে সক্ষম হতে পারবেন না যা 20+
বেনলুং

3

একটি কুরুচিপূর্ণ কিন্তু কাজের উপায় আছে। ফায়ারবেসম্যাসেজিং সার্ভিস.ক্লাসটি ছড়িয়ে দিন এবং এর আচরণটি সংশোধন করুন। তারপরে ক্লাসটিকে আপনার অ্যাপ্লিকেশনে ডান প্যাকেজটিতে রেখে দিন এবং ডেস্কটি মেসেজিং লাইবে নিজেই ক্লাসের পরিবর্তে এটি ব্যবহার করুন। এটি বেশ সহজ এবং কাজ করে।

পদ্ধতি আছে:

private void zzo(Intent intent) {
    Bundle bundle = intent.getExtras();
    bundle.remove("android.support.content.wakelockid");
    if (zza.zzac(bundle)) {  // true if msg is notification sent from FirebaseConsole
        if (!zza.zzdc((Context)this)) { // true if app is on foreground
            zza.zzer((Context)this).zzas(bundle); // create notification
            return;
        }
        // parse notification data to allow use it in onMessageReceived whe app is on foreground
        if (FirebaseMessagingService.zzav(bundle)) {
            zzb.zzo((Context)this, intent);
        }
    }
    this.onMessageReceived(new RemoteMessage(bundle));
}

এই কোডটি 9.4.0 সংস্করণ থেকে এসেছে, অবসন্নতার কারণে পদ্ধতিটির বিভিন্ন সংস্করণে আলাদা আলাদা নাম থাকবে।


3

যদি আপনার অ্যাপ্লিকেশন ব্যাকগ্রাউন্ডে থাকে তবে বিজ্ঞপ্তি আইকনটি সেট হবে ম্যাসেজ গ্রহণ পদ্ধতিটি কিন্তু আপনি অ্যাপ্লিকেশনটি অগ্রভাগে থাকলে বিজ্ঞপ্তি আইকনটি আপনি ম্যানিফেস্টে সংজ্ঞায়িত এক হবেন

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


2

আমি আমার বিজ্ঞপ্তিগুলি এফসিএম কনসোল থেকে এবং এইচটিটিপি / জেএসওনের মাধ্যমে ... একই ফলাফল দিয়ে ট্রিগার করছি।

আমি শিরোনাম, সম্পূর্ণ বার্তাটি পরিচালনা করতে পারি তবে আইকনটি সর্বদা একটি ডিফল্ট সাদা চেনাশোনা হয়:

বিজ্ঞপ্তি স্ক্রিনশট

কোডটিতে আমার কাস্টম আইকনের পরিবর্তে (সেটস্মলআইকন বা সেটস্মলআইকন) বা অ্যাপ্লিকেশন থেকে ডিফল্ট আইকন:

 Intent intent = new Intent(this, MainActivity.class);
    // use System.currentTimeMillis() to have a unique ID for the pending intent
    PendingIntent pIntent = PendingIntent.getActivity(this, (int) System.currentTimeMillis(), intent, 0);

    if (Build.VERSION.SDK_INT < 16) {
        Notification n  = new Notification.Builder(this)
                .setContentTitle(messageTitle)
                .setContentText(messageBody)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentIntent(pIntent)
                .setAutoCancel(true).getNotification();
        NotificationManager notificationManager =
                (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        //notificationManager.notify(0, n);
        notificationManager.notify(id, n);
    } else {
        Bitmap bm = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);

        Notification n  = new Notification.Builder(this)
                .setContentTitle(messageTitle)
                .setContentText(messageBody)
                .setSmallIcon(R.drawable.ic_stat_ic_notification)
                .setLargeIcon(bm)
                .setContentIntent(pIntent)
                .setAutoCancel(true).build();

        NotificationManager notificationManager =
                (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        //notificationManager.notify(0, n);
        notificationManager.notify(id, n);
    }

1
বুঝেছি! আমার <সেবা> ট্যাগ আমি গরম উত্তর এখানে Andro আইডি <আবেদন> ট্যাগ বাইরে stackoverflow.com/a/37352142/6366150
গনসালো

কেবল অগ্রভাগের অ্যাপ্লিকেশন চলমান নিয়েই কাজ করে ... পটভূমিতে এখনও একই আগের আচরণ পেয়েছে
গঞ্জালো

অ্যাপ্লিকেশনটি ভুলে গেছে যে গ্রাহক বিজ্ঞপ্তি আইকন ঠিকঠাক কাজ করছে তবে অ্যাপ্লিকেশন ব্যাকগ্রাউন্ডে সাদা বর্গাকার আইকন পাচ্ছেন দয়া করে আমাকে সহায়তা করুন
হর্ষ

1

এটি লিখুন

<meta-data 
         android:name="com.google.firebase.messaging.default_notification_icon"
         android:resource="@drawable/ic_notification" />

ডান নিচে <application.....>

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


0

ভেবেছিলাম আমি এইটির একটি উত্তর যুক্ত করব, যেহেতু আমার সমস্যাটি সহজ তবে লক্ষ্য করা শক্ত। বিশেষত আমি তৈরি করার সময় একটি বিদ্যমান মেটা-ডেটা উপাদানকে অনুলিপি / আটকানো হয়েছিল com.google.firebase.messaging.default_notification_icon, যা android:valueএর মান নির্দিষ্ট করার জন্য একটি ট্যাগ ব্যবহার করে । এটি বিজ্ঞপ্তি আইকনটির জন্য কাজ করবে না এবং আমি একবার এটি পরিবর্তন android:resourceহিসাবে প্রত্যাশার মতো কাজ করে নি।


default_notification_colorandroid:resourceandroid:value
মেটাও
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.