ফায়ারবেসে ব্যাকগ্রাউন্ডে থাকা অবস্থায় কীভাবে বিজ্ঞপ্তিটি হ্যান্ডেল করবেন


426

এখানে আমার প্রকাশ

    <service android:name=".fcm.PshycoFirebaseMessagingServices">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>

    <service android:name=".fcm.PshycoFirebaseInstanceIDService">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
        </intent-filter>
    </service>

অ্যাপ্লিকেশনটি যখন পটভূমিতে থাকে এবং বিজ্ঞপ্তি আসে তখন ডিফল্ট বিজ্ঞপ্তি আসে এবং আমার কোডটি চালায় না onMessageReceived

এখানে আমার onMessageReceivedকোড। আমার অ্যাপটি পটভূমিতে নয়, অ্যাপ্লিকেশন ব্যাকগ্রাউন্ডে চলাকালীন নয় This অ্যাপটি ব্যাকগ্রাউন্ডে থাকা অবস্থায় এই কোডটি কীভাবে চালানো যায়?

// [START receive_message]
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    // TODO(developer): Handle FCM messages here.
    // 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.
    data = remoteMessage.getData();
    String title = remoteMessage.getNotification().getTitle();
    String message = remoteMessage.getNotification().getBody();
    String imageUrl = (String) data.get("image");
    String action = (String) data.get("action");
    Log.i(TAG, "onMessageReceived: title : "+title);
    Log.i(TAG, "onMessageReceived: message : "+message);
    Log.i(TAG, "onMessageReceived: imageUrl : "+imageUrl);
    Log.i(TAG, "onMessageReceived: action : "+action);

    if (imageUrl == null) {
        sendNotification(title,message,action);
    } else {
        new BigPictureNotification(this,title,message,imageUrl,action);
    }
}
// [END receive_message]

1
এটি অনেসেসরাইজড () এর ওভাররাইড নমুনায় লেখা হয়েছে , দ্বিতীয় মন্তব্য লাইনে বলে Not getting messages here? See why this may be: goo.gl/39bRNJ । সমাধানটি, নীচের উত্তরগুলির মতো, বার্তাগুলিতে নোটিফিকেশন এবং ডেটা
পেওলড

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

1
এই সমাধানটি আমার জন্য কাজ করেছে stackoverflow.com/a/44150822/6632278 আশা সাহায্য করে। শুভকামনা
টনি বড়াজাস

কি ".এফসিএম।" PshycoFirebaseMessagingServices আপনার ম্যানিফেস্টে? আমি ক্লাসের ত্রুটি পেয়েছি যা পাওয়া যায় নি .. এবং প্যারামিটারের এই প্রথম অংশটি কোথাও পাইনি।
Éদার রোকা বেজারের

উত্তর:


660

১. কেন এমন হচ্ছে?

FCM এ দুটি ধরণের বার্তা রয়েছে (ফায়ারবেস ক্লাউড মেসেজিং):

  1. বার্তাগুলি প্রদর্শিত : এই বার্তাগুলি onMessageReceived()কেবল তখনই কলব্যাককে ট্রিগার করে যখন আপনার অ্যাপটি অগ্রভাগে থাকে
  2. ডেটা বার্তা : থিসিস বার্তা আরম্ভ onMessageReceived()কলব্যাক এমনকি যদি আপনার অ্যাপে হয় ফোরগ্রাউন্ড / পটভূমি / নিহত

দ্রষ্টব্য: ফায়ারবেস টিম data-messagesএখনও আপনার ডিভাইসে প্রেরণের জন্য কোনও ইউআই বিকাশ করতে পারেনি। এই ধরণের প্রেরণের জন্য আপনার সার্ভারটি ব্যবহার করা উচিত!



2. কিভাবে?

এটি অর্জন করতে, আপনাকে POSTনিম্নলিখিত ইউআরএলটিতে একটি অনুরোধ সম্পাদন করতে হবে :

POST https://fcm.googleapis.com/fcm/send

শিরোলেখ

  • কী: Content-Type , মান: application/json
  • কী: Authorization , মান: key=<your-server-key>

বিষয় ব্যবহার করে শরীর Body

{
    "to": "/topics/my_topic",
    "data": {
        "my_custom_key": "my_custom_value",
        "my_custom_key2": true
     }
}

অথবা আপনি যদি এটি নির্দিষ্ট ডিভাইসে প্রেরণ করতে চান

{
    "data": {
        "my_custom_key": "my_custom_value",
        "my_custom_key2": true
     },
    "registration_ids": ["{device-token}","{device2-token}","{device3-token}"]
}


দ্রষ্টব্য: আপনি JSON কী যোগ করছেন না তা নিশ্চিত করুন notification
নোট: আপনার সার্ভার কীটি পেতে, আপনি এটি ফায়ারবেস কনসোলে খুঁজে পেতে পারেন:Your project -> settings -> Project settings -> Cloud messaging -> Server Key

৩. পুশ বিজ্ঞপ্তি বার্তাটি কীভাবে পরিচালনা করবেন?

আপনি প্রাপ্ত বার্তাটি এভাবে পরিচালনা করেন:

@Override
public void onMessageReceived(RemoteMessage remoteMessage) { 
     Map<String, String> data = remoteMessage.getData();
     String myCustomKey = data.get("my_custom_key");

     // Manage data
}

4
এই পদক্ষেপগুলি অনুসরণ করে আপনি একই বিজ্ঞপ্তিতে "ডেটা" এবং "বিজ্ঞপ্তি" কীগুলি প্রেরণ করতে পারেন stackoverflow.com/a/42279260/2734021 :)
ড্যানিয়েল এস

15
Firebase team have not developed a UI to send data-messages to your devices, yet.বিগত বছরে কি এই পরিবর্তন হয়েছে?
হ্যাঙ্ক্রেকার্ডস

2
@ অ্যান্টোনিও ওরেওতে যখন অ্যাপ মারা গেছে, অন ম্যাসেজগ্রীক্ট কল হচ্ছে না। আমার কাছে কেবল ডেটা সহ পেডলোড রয়েছে। আপনার কোন আপডেট আছে?
সমীর মঙ্গরোলিয়া

63
অ্যাপটি যখন পটভূমিতে onMessageReceivedথাকে তখন কল হয় না এবং এটি এফসিএম-এ একটি গুরুতর সমস্যা !!! এছাড়াও আপনার উত্তর আপডেট করুন।
মুহাম্মদ বাবর

2
ঠিক আছে, আমার কাছে মনে হয় কিছু নির্দিষ্ট অ্যান্ড্রয়েড ডিভাইসে এটি ঘটে। এটি আসল সমস্যা বলে ভেবে ঘন্টা সময় ব্যয় করলেন, তবে তার পরে কিছুই হয়ে গেল না। সুতরাং আমার পরামর্শটি এটি বিভিন্ন ডিভাইসে পরীক্ষা করার জন্য। এমনকি আমি এটি কোনও ভিএম-তে পরীক্ষা করেছিলাম এবং অ্যাপটি মারা যাওয়ার পরেও আমি বিজ্ঞপ্তি পেয়েছি। আমি কারও সময় বাঁচাতে এই কথা বলছি।
তারেক-দেব

158

নিম্নলিখিত ক্ষেত্রে আপনার onMessageRe प्राप्त () কল করতে ফায়ারবেস লাইব্রেরি তৈরি করা

  1. অগ্রভাগে অ্যাপ্লিকেশন
  2. পটভূমিতে অ্যাপ্লিকেশন
  3. অ্যাপ মারা গেছে

আপনার অবশ্যই ফায়ারবেস এপিআইয়ের অনুরোধে জেএসএন কী 'বিজ্ঞপ্তি' রাখবেন না তবে পরিবর্তে 'ডেটা' ব্যবহার করুন, নীচে দেখুন।

নীচের বার্তাটি আপনার অ্যাপ ব্যাকগ্রাউন্ডে বা নিহত হওয়ার পরে আপনার onMessageRemitted () কল করবে না এবং আপনি আপনার বিজ্ঞপ্তিটি কাস্টমাইজ করতে পারবেন না।

{
   "to": "/topics/journal",
   "notification": {
   "title" : "title",
   "text": "data!",
   "icon": "ic_notification"
    }
}

পরিবর্তে এটি ব্যবহার করে কাজ করবে

{
  "to": "/topics/dev_journal",
   "data": {
       "text":"text",
       "title":"",
       "line1":"Journal",
       "line2":"刊物"
   }
} 

মূলত, বার্তাটি ম্যাপ হিসাবে আপনার ডেটা অবজেক্টের সাথে রিমোটমেসেজ যুক্তিটিতে প্রেরণ করা হয়, তবে আপনি এখানে স্নিপেটের মতো onMessage রসিফিকেশনটি পরিচালনা করতে পারবেন

@Override
public void onMessageReceived(RemoteMessage remoteMessage) { 
     Map<String, String> data = remoteMessage.getData();

     //you can get your text message here.
     String text= data.get("text");


     NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
        // optional, this is to make beautiful icon
             .setLargeIcon(BitmapFactory.decodeResource(
                                    getResources(), R.mipmap.ic_launcher))  
        .setSmallIcon(smallIcon)  //mandatory
      .......
    /*You can read more on notification here:
    https://developer.android.com/training/notify-user/build-notification.html
    https://www.youtube.com/watch?v=-iog_fmm6mE
    */
}

1
ফায়ারবেস কনসোল থেকে এটি অর্জন করা সম্ভব?
কোডার

@ কোডার, দুর্ভাগ্যক্রমে ফায়ারবেস কনসোল এটি সমর্থন করে না, কার্ল বা পোস্টম্যান (ক্রোম প্লাগইন), ফায়ারবেস মেসেজিং এপি যেমন ফায়ারবেসে পোস্ট বার্তা অনুরোধ প্রেরণের জন্য আপনাকে সরঞ্জামটি ব্যবহার করতে হবে দয়া করে এখানে নথির উল্লেখ করুন - ফায়ারবেস.google.com/docs / ক্লাউড-মেসেজিং / http-সার্ভার-রেফ
তীরকীট চিটাওয়াতনরত

1
এটি আমি এক দিনেরও বেশি অনুসন্ধান করেছিলাম ..... পুরোপুরি কার্যকরভাবে ধন্যবাদ আপনাকে ধন্যবাদ। এবং যদি আপনি ব্যাখ্যা করেন যে কীভাবে এই মানগুলি সহ কোনও ক্রিয়াকলাপ শুরু করার জন্য ডেটাতে কী কী ভাল উপাধ্যমগুলি onMessageReceed () এ পরিচালনা করা যায়।
বুপাঠি টি

25
অ্যাপটি ব্যাকগ্রাউন্ডে থাকা অবস্থায় আপনার পদ্ধতিটি
ঠিকঠাক কাজ করে

8
সানঝারের একই সমস্যা। অ্যাপটি মারা গেলে আমি কোনও বার্তা পাই না।
গিয়াকোমো এম

104

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

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

1. এটির মতো একটি উদ্দেশ্য-ফিল্টার যুক্ত করুন:

<activity android:name=".MainActivity">
      <intent-filter>
           <action android:name=".MainActivity" />
           <category android:name="android.intent.category.DEFAULT" />
      </intent-filter>
</activity>

এমন কোনও ক্রিয়াকলাপে যা আপনি বিজ্ঞপ্তি ডেটা প্রক্রিয়া করতে চান।

  1. পরবর্তী ফর্ম্যাট সহ বিজ্ঞপ্তিগুলি প্রেরণ করুন:

    { 
     "notification" : {
            "click_action" : ".MainActivity", 
            "body" : "new Symulti update !", 
            "title" : "new Symulti update !", 
            "icon" : "ic_notif_symulti" }, 
     "data": { ... },
     "to" : "c9Vaa3ReGdk:APA91bH-AuXgg3lDN2WMcBrNhJZoFtYF9" }

এখানে কী যুক্ত করা হয়

"click_action" : ".MainActivity"

যেখানে .আরএকটিভিটি হ'ল আপনি পদক্ষেপ 1 এ যুক্ত করেছেন এমন অভিপ্রায়-ফিল্টার সহ ক্রিয়াকলাপ।

  1. ".মেনএ্যাকটিভিটি" এর অনক্রিটিতে বিজ্ঞপ্তি থেকে "ডেটা" তথ্য পান:

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //get notification data info
        Bundle bundle = getIntent().getExtras();
        if (bundle != null) {
           //bundle must contain all info sent in "data" field of the notification
        }
    }

এবং এটি আপনার করা দরকার। আমি এই কারো সাহায্য করে আশা করি :)


5
এটি সঠিক উত্তর হওয়া উচিত। ট্রেটিতে প্রদর্শিত হওয়ার জন্য বিজ্ঞপ্তির জন্য ক্লিক_অ্যাকশন এবং একটি ইন্টেন্ট ফিল্টারের প্রয়োজনীয়তা সম্পর্কে ডক্সগুলির মধ্যে কেউই কিছুই বলে না। তারা উভয় প্রয়োজনীয়।
21:38

@ কিরূপে বিজ্ঞপ্তিটি দেখাতে তাদের প্রয়োজন নেই
সর্বদা কনফিউজড

আমার কাছে ডেটা এবং নোটিফিকেশন ব্লক উভয়ই আছে তবে আমি ক্রিয়াকলাপে ডেটা পেতে সক্ষম হই না?
আশ্বানি

3
আমি ঠিক বুঝতে পারি না এটি কীভাবে গৃহীত উত্তর নয়। ক্লিক_অ্যাকশন ব্যতীত এটি কার্যকর হবে না। আমার দিন
অরুণ শঙ্কর

4
অরুনশঙ্কর আপনার সমর্থনের জন্য ধন্যবাদ স্বীকৃত উত্তরটি আমার 7 মাস আগে উত্তর দিয়েছিল এবং এটির একটি ভাল উত্তর good আমি বুঝতে পারি না কেন কেউ ক্লিক_অ্যাকশন সম্পর্কে কথা বলে না এবং সে কারণেই আমি আমার উত্তর যুক্ত করেছি। আমি খুব খুশি যে এটি অনেক লোকের পক্ষে খুব কার্যকর হয়ে উঠছে এবং দিনের শেষে যে বিষয়টি গুরুত্বপূর্ণ তা হল :)
ড্যানিয়েল এস

42

ফায়ারবেস ব্যবহার করে ডাউনস্ট্রিম প্রেরণে ফায়ারবেস ডকুমেন্টেশন অনুসারে , 2 ধরণের পে -লোড রয়েছে:

  1. উপাত্ত

    এই পরামিতিটি বার্তার পেলোডের কাস্টম কী-মান জোড়গুলি নির্দিষ্ট করে। ক্লায়েন্ট অ্যাপ্লিকেশন ডেটা বার্তাগুলি প্রক্রিয়াকরণের জন্য দায়ী। ডেটা বার্তাগুলিতে কেবল কাস্টম কী-মান জোড়া রয়েছে।

  2. প্রজ্ঞাপন

    এই পরামিতিটি নোটিফিকেশন পেডের পূর্বনির্ধারিত, ব্যবহারকারী-দৃশ্যমান কী-মান জোড়া নির্দিষ্ট করে। এফসিএম স্বয়ংক্রিয়ভাবে ক্লায়েন্ট অ্যাপের পক্ষ থেকে শেষ-ব্যবহারকারী ডিভাইসে বার্তাটি প্রদর্শন করে। বিজ্ঞপ্তি বার্তাগুলিতে ব্যবহারকারী-দৃশ্যমান কীগুলির একটি পূর্বনির্ধারিত সেট রয়েছে।

আপনি যখন অগ্রভাগে থাকেন আপনি এফসিএম ব্যবহার করে ডেটা পেতে পারেন get onMessageRe प्राप्त () ডেটা পেতে পারেন, আপনি ডেটা পেলোড থেকে আপনার ডেটা পেতে পারেন ।

data = remoteMessage.getData();
String customData = (String) data.get("customData");

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

{
  "notification": {
        "title" : "title",
        "body"  : "body text",
        "icon"  : "ic_notification",
        "click_action" : "OPEN_ACTIVITY_1"
       }
}

এই প্রজ্ঞাপন পে লোড করার সময় ব্যবহৃত যখন আপনি আপনার অ্যাপ্লিকেশন পটভূমিতে থাকে সিস্টেম ট্রে বিজ্ঞপ্তি দেখাচ্ছে automactically চাই। আপনার অ্যাপ্লিকেশনটি ব্যাকগ্রাউন্ডে থাকা অবস্থায় বিজ্ঞপ্তি ডেটা পেতে, আপনাকে বিজ্ঞপ্তি পেডের ভিতরে ক্লিক_অ্যাকশন যুক্ত করা উচিত ।

আপনি যদি নিজের অ্যাপ্লিকেশনটি খুলতে চান এবং একটি নির্দিষ্ট ক্রিয়া সম্পাদন করতে চান [পশ্চাদপসারণের সময়], বিজ্ঞপ্তি পেডে ক্লিক_অ্যাকশন সেট করুন এবং আপনি যে ক্রিয়াকলাপটি চালু করতে চান তাতে কোনও উদ্দিষ্ট ফিল্টারটিতে মানচিত্র করুন। উদাহরণস্বরূপ, নিম্নলিখিতগুলির মতো ইন্টেন্ট ফিল্টারটি ট্রিগার করতে OPEN_ACTIVITY_1 এ ক্লিক_অ্যাকশন সেট করুন:

<intent-filter>
  <action android:name="OPEN_ACTIVITY_1" />
  <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

আপনার ক্রিয়াকলাপের ট্যাগের মধ্যে inside অভিপ্রায় ফিল্টারটি আপনার ম্যানিফেস্টে রাখুন। আপনি যখন বিজ্ঞপ্তিটি ক্লিক করেন, এটি অ্যাপ্লিকেশনটি খুলবে এবং ক্লিক_অ্যাকশনটিতে আপনি যে ক্রিয়াকলাপটি সংজ্ঞায়িত করেছেন সরাসরি এটিতে চলে যাবে, এই ক্ষেত্রে "OPEN_ACTIVTY_1"। এবং সেই ক্রিয়াকলাপের ভিতরে আপনি নিম্নলিখিতটি ডেটা পেতে পারেন:

Bundle b = getIntent().getExtras();
String someData = b.getString("someData");

আমি আমার অ্যান্ড্রয়েড অ্যাপ্লিকেশনটির জন্য এফসিএম ব্যবহার করছি এবং উভয় পে-লোড ব্যবহার করছি। আমি ব্যবহার করছি JSON এর উদাহরণ এখানে:

{
  "to": "FCM registration ID",
  "notification": {
    "title" : "title",
    "body"  : "body text",
    "icon"  : "ic_notification",
    "click_action" : "OPEN_ACTIVITY_1"
   },
   "data": {
     "someData"  : "This is some data",
     "someData2" : "etc"
   }
}

"অ্যাপ্লিকেশন ট্যাগের অভ্যন্তরে আপনার ম্যানিফেস্টে সেই অভিপ্রায়-ফিল্টারটি রেখে দিন" " আপনি অ্যাপ্লিকেশন ট্যাগের মধ্যে অভিপ্রায়-ফিল্টার রাখতে পারবেন না।
কিরিলো জাপিলাইভ

আপনার JSON ডান ক্লিক_অ্যাকশন কী যায় তা দেখায় না।
জোশ

এই সঠিক উত্তর না? ক্লিক অ্যাকশন এন কি এটি যায়? কারও কারও ভোট বাতিল করা উচিত বা এটি পরিষ্কার করা উচিত
রানা

1
@ কাইরালোজ্যাপিলিয়েভ আমি কেবলমাত্র উত্তরটি সংশোধন ও আপডেট করেছি: "আপনার ক্রিয়াকলাপের কোনও ট্যাগের মধ্যে সেই অভিপ্রায়-ফিল্টারটি আপনার ম্যানিফেস্টে রাখুন"।
ডিকা

1
@ জোশ আপডেট হয়েছে এবং ফর্ম্যাট হয়েছে। আপনি এটি আবার চেক করতে পারেন
ডিকা

32

ডক্স অনুসারে

একটি পটভূমি অ্যাপ্লিকেশন বার্তা হ্যান্ডেল করুন

আপনার অ্যাপ্লিকেশনটি যখন পটভূমিতে থাকে তখন অ্যান্ড্রয়েড সিস্টেম ট্রেতে বিজ্ঞপ্তি বার্তাগুলির নির্দেশ দেয়। বিজ্ঞপ্তিতে একটি ব্যবহারকারী ট্যাপ ডিফল্টভাবে অ্যাপ্লিকেশন লঞ্চারটি খুলবে।

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

আপনি যদি আপনার অ্যাপ্লিকেশনটি খুলতে চান এবং একটি নির্দিষ্ট ক্রিয়া সম্পাদন করতে চান তবে বিজ্ঞপ্তি পেডে ক্লিক_অ্যাকশন সেট করুন এবং আপনি যে কার্যকলাপটি চালু করতে চান তাতে কোনও উদ্দিষ্ট ফিল্টারে মানচিত্র করুন। উদাহরণস্বরূপ, নিম্নলিখিতগুলির মতো ইন্টেন্ট ফিল্টারটি ট্রিগার করতে OPEN_ACTIVITY_1 এ ক্লিক_অ্যাকশন সেট করুন:

 <intent-filter>   <action android:name="OPEN_ACTIVITY_1" />  
 <category android:name="android.intent.category.DEFAULT" />
 </intent-filter>

সম্পাদনা করুন:

এই থ্রেড উপর ভিত্তি করে :

আপনি ফায়ারবেস কনসোল ব্যবহার করে ক্লিক_অ্যাকশন পেডলোড সেট করতে পারবেন না। আপনি কার্ল কমান্ড বা একটি কাস্টম http সার্ভার দিয়ে পরীক্ষা করার চেষ্টা করতে পারেন

curl --header "Authorization: key=<YOUR_KEY_GOES_HERE>" 
     --header Content-Type:"application/json" https://fcm.googleapis.com/fcm/send  
     -d "{\"to\":\"/topics/news\",\"notification\": 
         {\"title\": \"Click Action Message\",\"text\": \"Sample message\",
            \"click_action\":\"OPEN_ACTIVITY_1\"}}"

1
তুমি ঠিক. আমি ডকস পড়েছি তবে আমার বিভ্রান্তি কোথায় আছে আমার প্রকাশ্যে? আমাকে j জাভা ফাইলে onMessageRemitted তে কোড চালাতে হবে তাই স্যার আমাকে কী করতে হবে?
পার্থ প্যাটেল

আপনি অ্যাপ্লিকেশনটিকে ব্যাকগ্রাউন্ডে থাকা অবস্থায় ম্যাসেজআরভিসেকে স্বয়ংক্রিয়ভাবে কল করতে পারবেন না। পরিবর্তে আপনাকে প্রাপ্ত অভিপ্রায়টি পরিচালনা করতে হবে এবং হ্যান্ডলারটি কল করতে হবে। অথবা সম্ভবত পৃথক শ্রেণি / পদ্ধতি প্রয়োগ করা ভাল যা onMessageReveised এবং আপনার অভিপ্রায় পরিচালনা উভয় দ্বারা ডাকা হয়। আমি মূল ক্রিয়াকলাপের নতুন সংস্করণে হ্যান্ডলার যুক্ত করেছি এবং এটি আমার পক্ষে ভাল কাজ করে।
দিডু

@ পার্থ প্যাটেল প্রশ্নের উত্তর দিতে খুব দেরি হয়েছে তবে সম্ভবত এটি একই সমস্যার সাথে অন্য কাউকে সহায়তা করবে, আমার উত্তরটি এখানে দেখুন stackoverflow.com/a/42279260/2734021
ড্যানিয়েল এস

কোথায় এই পদক্ষেপের জন্য রাখা ছিল? আমার ক্রিয়াকলাপ বা ফায়ারবেসমেজ পরিষেবাটির জন্য?
মাহদি

** একাধিক বিজ্ঞপ্তি পুনর্নির্দেশ কাজ করছে না? উদাহরণস্বরূপ: যদি আমার "ক্লিক_অ্যাকশন" ব্যাকগ্রাউন্ডে এফসিএম থেকে তিনটি বিজ্ঞপ্তি সফলভাবে পুনঃনির্দেশিত হয় এবং তারপরে 2 টি বিজ্ঞপ্তি ক্লিক করে ক্রিয়াকলাপ পুনর্নির্দেশ কাজ করছে না
প্রসংশমুরুগান

24

জুলাই 2019 হিসাবে কাজ করা

অ্যান্ড্রয়েড সংকলনএসডিকি ভার্সন 28, বিল্ডটুলস ভার্সন 28.0.3 এবং ফায়ারবেস-বার্তাপ্রেরণ: 19.0.1

অন্যান্য স্ট্যাকওভারফ্লো প্রশ্ন এবং উত্তরগুলির অনেকগুলি গবেষণার পরে এবং অগণিত পুরানো সমাধানগুলির চেষ্টা করার পরে, এই 3 টি পরিস্থিতিতে এই সমাধান বিজ্ঞপ্তিগুলি প্রদর্শন করতে সক্ষম হয়েছিল:

- অ্যাপটি অগ্রভাগে রয়েছে:
নোটিফিকেশনটি আমার মাইফায়ারবেসমেসেজিং সার্ভিস ক্লাসে onMessageReceed পদ্ধতি দ্বারা প্রাপ্ত হয়েছে

- অ্যাপ্লিকেশনটি হত্যা করা হয়েছে (এটি পটভূমিতে চলছে না): বিজ্ঞপ্তিটি এফসিএম দ্বারা স্বয়ংক্রিয়ভাবে বিজ্ঞপ্তি ট্রেতে প্রেরণ করা হয়। ব্যবহারকারী বিজ্ঞপ্তিটি স্পর্শ করলে অ্যাপ্লিকেশনটি অ্যানড্রইডের ক্রিয়াকলাপটিকে কল করে ম্যানিফেস্টে অ্যানড্রয়েড। আপনি onCreate () পদ্ধতিতে getIntent ()। GetExtras () ব্যবহার করে বিজ্ঞপ্তির ডেটা অংশটি পেতে পারেন।

- অ্যাপটি ব্যাকগ্রাউন্ডে রয়েছে: বিজ্ঞপ্তিটি এফসিএম দ্বারা স্বয়ংক্রিয়ভাবে বিজ্ঞপ্তি ট্রেতে প্রেরণ করা হয়। ব্যবহারকারী নোটিফিকেশন স্পর্শ করলে অ্যাপ্লিকেশনটিকে ম্যানিফেস্টে অ্যানড্রয়েড.ইনটিটি.এই.এইচএইচআরএর ক্রিয়াকলাপটি চালু করে অগ্রভাগে আনা হয়। যেহেতু আমার অ্যাপ্লিকেশনটিতে সেই ক্রিয়াকলাপে লঞ্চমোড = "সিঙ্গলটপ" রয়েছে, তাই অনক্রিট () পদ্ধতিটি বলা হয় না কারণ ইতিমধ্যে একই শ্রেণীর একটি ক্রিয়াকলাপ তৈরি করা হয়েছে, পরিবর্তে সেই শ্রেণীর অন্নইভেন্ট () পদ্ধতিটি কল করা হয় এবং আপনি সেই অংশটির ডেটা অংশ পান Intent.getExtras () ব্যবহার করে সেখানে বিজ্ঞপ্তি।

পদক্ষেপ: 1- আপনি যদি আপনার অ্যাপ্লিকেশনটির মূল ক্রিয়াকলাপটি এভাবে সংজ্ঞায়িত করেন:

<activity
    android:name=".MainActivity"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:screenOrientation="portrait"
    android:launchMode="singleTop">
    <intent-filter>
        <action android:name=".MainActivity" />
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

2- আপনার মেইনঅ্যাক্টিভিটি.ক্লাসের অনক্রিট () পদ্ধতিতে এই লাইনগুলি যুক্ত করুন

Intent i = getIntent();
Bundle extras = i.getExtras();
if (extras != null) {
    for (String key : extras.keySet()) {
        Object value = extras.get(key);
        Log.d(Application.APPTAG, "Extras received at onCreate:  Key: " + key + " Value: " + value);
    }
    String title = extras.getString("title");
    String message = extras.getString("body");
    if (message!=null && message.length()>0) {
        getIntent().removeExtra("body");
        showNotificationInADialog(title, message);
    }
}

এবং একই মেইনএ্যাকটিভিটি.ক্লাসে এই পদ্ধতিগুলি:

@Override
public void onNewIntent(Intent intent){
    //called when a new intent for this class is created.
    // The main case is when the app was in background, a notification arrives to the tray, and the user touches the notification

    super.onNewIntent(intent);

    Log.d(Application.APPTAG, "onNewIntent - starting");
    Bundle extras = intent.getExtras();
    if (extras != null) {
        for (String key : extras.keySet()) {
            Object value = extras.get(key);
            Log.d(Application.APPTAG, "Extras received at onNewIntent:  Key: " + key + " Value: " + value);
        }
        String title = extras.getString("title");
        String message = extras.getString("body");
        if (message!=null && message.length()>0) {
            getIntent().removeExtra("body");
            showNotificationInADialog(title, message);
        }
    }
}


private void showNotificationInADialog(String title, String message) {

    // show a dialog with the provided title and message
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle(title);
    builder.setMessage(message);
    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            dialog.cancel();
        }
    });
    AlertDialog alert = builder.create();
    alert.show();
}

3- মাইফায়ারবেস ক্লাসটি এভাবে তৈরি করুন:

package com.yourcompany.app;

import android.content.Intent;
import android.util.Log;

import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;

public class MyFirebaseMessagingService extends FirebaseMessagingService {


    public MyFirebaseMessagingService() {
        super();
    }

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {

        Log.d(Application.APPTAG, "myFirebaseMessagingService - onMessageReceived - message: " + remoteMessage);

        Intent dialogIntent = new Intent(this, NotificationActivity.class);
        dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        dialogIntent.putExtra("msg", remoteMessage);
        startActivity(dialogIntent);

    }

}

4- নতুন ক্লাস নোটিফিকেশনঅ্যাক্টিভিটি.ক্লাস তৈরি করুন:

package com.yourcompany.app;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.view.ContextThemeWrapper;

import com.google.firebase.messaging.RemoteMessage;

public class NotificationActivity extends AppCompatActivity {

private Activity context;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    context = this;
    Bundle extras = getIntent().getExtras();

    Log.d(Application.APPTAG, "NotificationActivity - onCreate - extras: " + extras);

    if (extras == null) {
        context.finish();
        return;
    }

    RemoteMessage msg = (RemoteMessage) extras.get("msg");

    if (msg == null) {
        context.finish();
        return;
    }

    RemoteMessage.Notification notification = msg.getNotification();

    if (notification == null) {
        context.finish();
        return;
    }

    String dialogMessage;
    try {
        dialogMessage = notification.getBody();
    } catch (Exception e){
        context.finish();
        return;
    }
    String dialogTitle = notification.getTitle();
    if (dialogTitle == null || dialogTitle.length() == 0) {
        dialogTitle = "";
    }

    AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(context, R.style.myDialog));
    builder.setTitle(dialogTitle);
    builder.setMessage(dialogMessage);
    builder.setPositiveButton(getResources().getString(R.string.accept), new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            dialog.cancel();
        }
    });
    AlertDialog alert = builder.create();
    alert.show();

}

}

5- আপনার ট্যাগগুলির মধ্যে আপনার অ্যাপ্লিকেশন ম্যানিফেস্টে এই লাইনগুলি যুক্ত করুন

    <service
        android:name=".MyFirebaseMessagingService"
        android:exported="false">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>

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

    <activity android:name=".NotificationActivity"
        android:theme="@style/myDialog"> </activity>

    <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/color_accent" />

Your- আপনার অ্যাপ্লিকেশন.জবা অনক্রিট () পদ্ধতিতে বা মেইনএকটিভিটি.ক্লাস অনক্রিট () পদ্ধতিতে এই লাইনগুলি যুক্ত করুন:

      // notifications channel creation
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
      // Create channel to show notifications.
      String channelId = getResources().getString("default_channel_id");
      String channelName = getResources().getString("General announcements");
      NotificationManager notificationManager = getSystemService(NotificationManager.class);
      notificationManager.createNotificationChannel(new NotificationChannel(channelId,
              channelName, NotificationManager.IMPORTANCE_LOW));
  }

সম্পন্ন.

3 টি উল্লিখিত দৃশ্যে এটির জন্য ভাল কাজ করার জন্য আপনাকে ফায়ারবেস ওয়েব কনসোল থেকে নিম্নলিখিত উপায়ে বিজ্ঞপ্তিটি পাঠাতে হবে:

বিজ্ঞপ্তি বিভাগে: বিজ্ঞপ্তি শিরোনাম = বিজ্ঞপ্তি সংলাপে প্রদর্শিত শিরোনাম (alচ্ছিক) বিজ্ঞপ্তি পাঠ্য = ব্যবহারকারীর কাছে প্রদর্শিত বার্তা (প্রয়োজনীয়) তারপরে লক্ষ্য বিভাগে: অ্যাপ = আপনার অ্যান্ড্রয়েড অ্যাপ্লিকেশন এবং অতিরিক্ত বিকল্প বিভাগে: অ্যান্ড্রয়েড বিজ্ঞপ্তি চ্যানেল = ডিফল্ট_চ্যানেল_আইড কাস্টম ডেটা কী: শিরোনাম মান: (বিজ্ঞপ্তি বিভাগের শিরোনাম ক্ষেত্রের তুলনায় এখানে একই পাঠ্য) কী: দেহের মান: (বিজ্ঞপ্তি বিভাগের বার্তা ক্ষেত্রের তুলনায় এখানে একই পাঠ্য) কী: ক্লিক_অ্যাকশন মান: .আরঅ্যাক্টিভিটি সাউন্ড = অক্ষম
মেয়াদ শেষ হয় = 4 সপ্তাহ

গুগল প্লে দিয়ে আপনি এপিউলে 28 এর মাধ্যমে এমুলেটরটিতে এটি ডিবাগ করতে পারেন।

শুভ কোডিং!


2
এই দুর্দান্ত উত্তরের জন্য আপনাকে ধন্যবাদ।
অ্যালেক্স চেঙ্গালান

@ আলভারো, আমি যখন বিজ্ঞপ্তিটি পেয়েছি তখন url খুলতে চাই, আমি কীভাবে এটি পরিচালনা করতে পারি
19 '15

অ্যাপটি নিকট বা নিহত হওয়ার সময় ভিভো ওপ্প ফোনে কাজ করছেন না
অ্যান্ড্রয়েড বিকাশকারী

আমি একটি ভিভো ফোনে চেষ্টা করি নি তবে বর্তমানে এটি অন্যান্য অনেক অ্যান্ড্রয়েড ফোনে কাজ করছে। দয়া করে ধাপে ধাপে প্রতিটি ধাপে পড়ুন, সমস্ত বিবরণটি পরীক্ষা করে দেখুন এবং তারপরে আমি এখানে উল্লিখিত প্রতিটি পদ্ধতির প্রথম লাইনে ডিবাগিং ব্রেকপয়েন্টগুলি চালু করুন, তারের সাহায্যে আপনার বিকাশ কম্পিউটারে একটি আসল ফোন সংযুক্ত করুন এবং প্রেরণ করার সময় অ্যাপটি ডিবাগ করুন এফসিএম থেকে একটি বার্তা। আপনি যে প্যারামিটারগুলি এবং আমি উল্লেখ করেছি সেই ফর্ম্যাট সহ আপনি FCM বার্তা প্রেরণ করছেন কিনা তা পরীক্ষা করে দেখুন। শুভকামনা!
alvaro

2
ফায়ারবেস ডকুমেন্টেশন যেমনটি পড়েছে এটি এটি সর্বাধিক আপ-টু উত্তর, যখন আপনার অ্যাপ্লিকেশন পটভূমিতে থাকে তখন অ্যান্ড্রয়েড সিস্টেম ট্রেতে বিজ্ঞপ্তি বার্তাগুলির নির্দেশ দেয়। বিজ্ঞপ্তিতে একটি ব্যবহারকারী ট্যাপ ডিফল্টভাবে অ্যাপ্লিকেশন লঞ্চারটি খুলবে। এটিতে এমন বার্তাগুলি অন্তর্ভুক্ত রয়েছে যাতে বিজ্ঞপ্তি এবং ডেটা পেডলোড উভয়ই থাকে। এই ক্ষেত্রে, বিজ্ঞপ্তিটি ডিভাইসের সিস্টেম ট্রেতে বিতরণ করা হয় এবং ডেটা পেডলোডটি আপনার লঞ্চের ক্রিয়াকলাপের উদ্দেশ্য হিসাবে অতিরিক্ত হিসাবে বিতরণ করা হয়। ( firebase.google.com/docs/cloud-messaging/android/… ) এত পুরানো উত্তর পুরানো
দাঙ্গা চলে যায়

20

যেহেতু display-messagesফায়ারবেস বিজ্ঞপ্তি ইউআই থেকে প্রেরিত হয় কেবলমাত্র যদি আপনার অ্যাপটি অগ্রভাগে থাকে তবে কাজ করে। কারণ data-messages, এফসিএম- তে একটি পোষ্ট কল করা দরকার

ধাপ

  1. অ্যাডভান্সড রেস্ট ক্লায়েন্ট গুগল ক্রোম এক্সটেনশন ইনস্টল করুন এখানে চিত্র বর্ণনা লিখুন

  2. নিম্নলিখিত শিরোনাম যুক্ত করুন

    কী : সামগ্রী-প্রকার, মান : অ্যাপ্লিকেশন / জেসন

    কী : অনুমোদন, মান : কী = "আপনার সার্ভার কী" এখানে চিত্র বর্ণনা লিখুন

  3. শরীর যোগ করুন

    • বিষয়গুলি ব্যবহার করা হলে:

      {
          "to" : "/topics/topic_name",
          "data": {
          "key1" : "value1",
          "key2" : "value2",
          }
      }
    • নিবন্ধকরণ আইডি ব্যবহার করা হলে:

      {
          "registration_ids" : "[{"id"},{id1}]",
          "data": {
          "key1" : "value1",
          "key2" : "value2",
           }
      }

এটাই!. এখন শুনুনonMessageReceived যথারীতি কলব্যাক ।

@Override
public void onMessageReceived(RemoteMessage remoteMessage) { 
     Map<String, String> data = remoteMessage.getData();
     String value1 = data.get("key1");
     String value2 = data.get("key2");
}

20

ব্যাকগ্রাউন্ডে বার্তাটি ক্যাপচার করতে আপনার একটি ব্যবহার করতে হবে BroadcastReceiver

import android.content.Context
import android.content.Intent
import android.util.Log
import androidx.legacy.content.WakefulBroadcastReceiver
import com.google.firebase.messaging.RemoteMessage

class FirebaseBroadcastReceiver : WakefulBroadcastReceiver() {

    val TAG: String = FirebaseBroadcastReceiver::class.java.simpleName

    override fun onReceive(context: Context, intent: Intent) {

        val dataBundle = intent.extras
        if (dataBundle != null)
            for (key in dataBundle.keySet()) {
                Log.d(TAG, "dataBundle: " + key + " : " + dataBundle.get(key))
            }
        val remoteMessage = RemoteMessage(dataBundle)
        }
    }

এবং এটি আপনার প্রকাশ্যে যুক্ত করুন:

<receiver
      android:name="MY_PACKAGE_NAME.FirebaseBroadcastReceiver"
      android:exported="true"
      android:permission="com.google.android.c2dm.permission.SEND">
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        </intent-filter>
</receiver>

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

এই মুহূর্তে কাজ করে না, তাই আমি এই সমাধানটির প্রস্তাব করছি। গুগল বাগবেসে একটি ফাইল করা বাগ রয়েছে। আপনি এটি পরীক্ষা করে দেখতে চাইতে পারেন।
রোমুলানো

আপনি দয়া করে এখানে বাগের জন্য একটি লিঙ্ক পোস্ট করতে পারেন
গ্যালিয়া

কীভাবে বিজ্ঞপ্তি থেকে তথ্য পাবেন?
রবি বাঘেলা

অ্যাপটি মারা যাওয়ার পরে এটি স্পষ্টভাবে কাজ করছে না। আমি কয়েক ঘন্টার জন্য এই সমাধান চেষ্টা করেছি। কোনও কারণে রিসিভারটি অ্যাপটি পটভূমিতে থাকাকালীন কাজ করছে এবং অ্যাপটি মারা যাওয়ার সময় কাজ করছে না
XcodeNOOB

16
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {

}

অ্যাপটি ভুলে যাওয়া অবস্থায় থাকলেই তাকে প্রতিবার ডাকা হয় না

ফোরগ্রাউন্ডে বা ব্যাকগ্রাউন্ডে বা হত্যা করা কোনও অ্যাপই নয়, তবে এই পদ্ধতিটি ফায়ারবেস এপিআই সংস্করণ সহ উপলভ্য নয়, এই পদ্ধতিটি প্রতিবারই বলা হয় one

এই সংস্করণটি আপনাকে গ্রেড থেকে আমদানি করতে হবে

compile 'com.google.firebase:firebase-messaging:10.2.1'

এই পদ্ধতি

@Override
public void handleIntent(Intent intent) {
    super.handleIntent(intent);

    // you can get ur data here 
    //intent.getExtras().get("your_data_key") 


}

পূর্ববর্তী ফায়ারবেস এপিআই সহ এই পদ্ধতিটি ছিল না তাই অ্যাপটিতে ব্যাকগ্রাউন্ডে থাকা অবস্থায় ফায়ার বেস নিজেই হ্যান্ডেল করে .... এখন আপনি যা করতে চান তা এই পদ্ধতিটি আপনার আছে ... আপনি এই পদ্ধতিতে এখানে এটি করতে পারেন .. ...

আপনি যদি ডিফল্ট ক্রিয়াকলাপের তুলনায় পূর্ববর্তী সংস্করণ ব্যবহার করেন তবে আপনি একইভাবে ডেটা পেতে পারেন

if(getIntent().getExtras() != null && getIntent().getExtras().get("your_data_key") != null) {
String strNotificaiton = getIntent().getExtras().get("your_data_key").toString();

// আপনি যা চান তা করুন ....}

সাধারণত এটি হ'ল সার্ভারের কাঠামো যা আমরা বিজ্ঞপ্তি পাই

{
    "notification": {
        "body": "Cool offers. Get them before expiring!",
        "title": "Flat 80% discount",
        "icon": "appicon",
        "click_action": "activity name" //optional if required.....
    },
    "data": {
        "product_id": 11,
        "product_details": "details.....",
        "other_info": "......."
    }
}

এটি আপনি কীভাবে সেই ডেটা কীটি দিতে চান বা আপনি যে যা কিছু দিতে পারেন তার বিজ্ঞপ্তি দিতে চান ....... আপনি কি একই কি দিয়ে এখানে যাবেন তা সেই তথ্য পাবেন ........ ।

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


আমি ফায়ারবেস-ম্যাসেজিং 10.2.1 এ আপডেট করেছি, বিজ্ঞপ্তি বার্তায় ডেটা যুক্ত করেছি এবং এটি কার্যকর হয়েছে। অগ্রভূমি, পটভূমি এবং নিহত। ধন্যবাদ
ফিরস শ্রৌরূ

কোটলিনে, আমি এই ত্রুটিটি পেয়েছি: (44, 5) 'ফায়ারবেসমেজিংসেবা'র' হ্যান্ডেল ইনটেন্ট 'চূড়ান্ত এবং ওভাররাইড করা যাবে না
উগালি নরম


14

ডক্স অনুসারে: মে 17, 2017

আপনার অ্যাপ্লিকেশনটি যখন পটভূমিতে থাকে তখন অ্যান্ড্রয়েড সিস্টেম ট্রেতে বিজ্ঞপ্তি বার্তাগুলির নির্দেশ দেয়। বিজ্ঞপ্তিতে একটি ব্যবহারকারী ট্যাপ ডিফল্টভাবে অ্যাপ্লিকেশন লঞ্চারটি খুলবে ।

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

সুতরাং, আপনার উভয়ই বেতনের বিজ্ঞপ্তি + ডেটা ব্যবহার করা উচিত:

{
  "to": "FCM registration ID",
  "notification": {
    "title" : "title",
    "body"  : "body text",
    "icon"  : "ic_notification"
   },
   "data": {
     "someData"  : "This is some data",
     "someData2" : "etc"
   }
}

ক্লিক_অ্যাকশন ব্যবহার করার দরকার নেই LA লঞ্চ ক্রিয়াকলাপের উদ্দেশ্যে আপনার কেবল এক্সট্রা পাওয়া উচিত

<activity android:name=".MainActivity">
        <intent-filter>
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
</activity>

জাভা কোডটি মূল ক্রিয়াকলাপে অনক্রিট পদ্ধতিতে থাকা উচিত:

Intent intent = getIntent();
if (intent != null && intent.getExtras() != null) {
    Bundle extras = intent.getExtras();
    String someData= extras.getString("someData");
    String someData2 = extras.getString("someData2");
}

আপনি ফায়ারবেইস নোটিফিকেশন কনসোল থেকে পেললোড বিজ্ঞপ্তি + ডেটা উভয়ই পরীক্ষা করতে পারেন । উন্নত বিকল্প বিভাগে কাস্টম ডেটা ক্ষেত্রগুলি পূরণ করতে ভুলবেন না


13

ফায়ারবেস বার্তা সম্পর্কে আরও স্পষ্ট ধারণা এখানে। আমি তাদের সমর্থন দল থেকে এটি পেয়েছি।

ফায়ারবাসে তিনটি বার্তার প্রকার রয়েছে :

বিজ্ঞপ্তি বার্তা : বিজ্ঞপ্তি বার্তা ব্যাকগ্রাউন্ড বা অগ্রভাগে কাজ করে। অ্যাপ্লিকেশন পটভূমিতে থাকলে, বিজ্ঞপ্তি বার্তা সিস্টেম ট্রেতে সরবরাহ করা হয়। অ্যাপ্লিকেশনটি অগ্রভাগে থাকলে, বার্তাগুলি হ'ল onMessageReceived()বা didReceiveRemoteNotificationকলব্যাকগুলি দ্বারা পরিচালনা করা হয় । এগুলি হ'ল প্রদর্শন বার্তা হিসাবে উল্লেখ করা হয়।

ডেটা বার্তা : অ্যান্ড্রয়েড প্ল্যাটফর্মে, ডেটা বার্তা ব্যাকগ্রাউন্ড এবং অগ্রভাগে কাজ করতে পারে। ডেটা বার্তাটি onMessageRe प्राप्त () দ্বারা পরিচালিত হবে। প্ল্যাটফর্মের জন্য নির্দিষ্ট নোটটি হ'ল: অ্যান্ড্রয়েডে, আপনার ক্রিয়াকলাপ চালু করতে ব্যবহৃত ইনটেন্টে ডেটা পেডলোডটি পুনরুদ্ধার করা যেতে পারে। বিস্তারিতভাবে বলতে গেলে, যদি আপনার কাছে থাকে তবে আপনি কেবলমাত্র থেকে "click_action":"launch_Activity_1"এই উদ্দেশ্যটি পুনরুদ্ধার করতে পারেন ।getIntent()Activity_1

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

এছাড়াও, আমি আপনাকে onMessageReceivedডেটা বান্ডেল নিষ্কাশন করার জন্য পদ্ধতি (ডেটা বার্তা দেখুন) ব্যবহার করার পরামর্শ দিচ্ছি । আপনার যুক্তি থেকে, আমি বান্ডিল অবজেক্টটি চেক করেছি এবং প্রত্যাশিত ডেটা সামগ্রী খুঁজে পাই না। এখানে একই ধরণের মামলার একটি রেফারেন্স দেওয়া হয়েছে যা আরও স্পষ্টতা দিতে পারে।

আরও তথ্যের জন্য আমার এই থ্রেডটি দেখুন



8

এই মত সহজ সংক্ষিপ্তসার

  • যদি আপনার অ্যাপটি চলছে;

    onMessageReceived()

ট্রিগার হয়।

  • যদি আপনার অ্যাপটি চলমান না থাকে (সোয়াইপ করে হত্যা করা হয়);

    onMessageReceived()

ডাইরেক্টিটি দ্বারা ট্রিগার এবং বিতরণ করা হয় না। আপনার যদি কোনও বিশেষ কী-মান জুড়ি থাকে। তারা onMessageRe प्राप्त () কাজ না করে কাজের বীচি ব্যবহার করে না।

আমি এইভাবে খুঁজে পেয়েছি;

আপনার প্রবর্তক ক্রিয়াকলাপে, এই যুক্তিটি রাখুন,

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState, R.layout.activity_splash);

    if (getIntent().getExtras() != null && getIntent().getExtras().containsKey("PACKAGE_NAME")) {

        // do what you want

        // and this for killing app if we dont want to start
        android.os.Process.killProcess(android.os.Process.myPid());

    } else {

        //continue to app
    }
}

এটি যদি অবরুদ্ধ করে থাকে তবে ফায়ারবেস ইউআই অনুযায়ী আপনার কীগুলি অনুসন্ধান করুন।

এই উদাহরণে আমার কী এবং উপরের মতো মান; (ভাষার জন্য দুঃখিত =)) এখানে চিত্র বর্ণনা লিখুন

যখন আমার কোড কাজ করে, আমি "com.rda.note" পাই।

android.os.Process.killProcess(android.os.Process.myPid());

এই লাইন কোডের সাহায্যে আমি আমার অ্যাপ্লিকেশনটি বন্ধ করে দিয়ে গুগল প্লে মার্কেট খুলি

শুভ কোডিং =)


6

আমি পরিস্থিতিগুলি বের করেছিলাম,

যখন অ্যাপ্লিকেশনটি চালু আছে ফোরগ্রাউন্ড , onMessageReceived () পদ্ধতি থেকে বলা হয় FirebaseService .So pendingIntent সেবা বর্গ সংজ্ঞায়িত ডাকা হবে।

এবং অ্যাপ্লিকেশন যখন পটভূমিতে থাকে , তখন প্রথম ক্রিয়াকলাপটি বলা হয়।

এখন, আপনি একটি ব্যবহার স্প্ল্যাশ কার্যকলাপ , তারপর আবশ্যক মনে রাখা splashactivity ডাকা হবে আর, যদি কোন splashActivity, তারপর যাই হোক না কেন প্রথম কার্যকলাপ বলা হবে।

তারপরে আপনার কোনও বান্ডিল রয়েছে কিনা তা দেখার জন্য আপনাকে প্রথম অ্যাক্টিভিটির getIntent () পরীক্ষা করে দেখতে হবে everything সবকিছু ঠিকঠাক থাকলে আপনি দেখতে পাবেন যে বান্ডেলটি ভরাট মান সহ রয়েছে server সার্ভার থেকে প্রেরিত ডেটা ট্যাগের মানটি যদি এইরকম দেখায়,

"data": {
    "user_name": "arefin sajib",
    "value": "user name notification"
  }

তারপরে প্রথম ক্রিয়াকলাপে আপনি দেখতে পাবেন, এখানে একটি বৈধ অভিপ্রায় ( getIntent () নাল নয় ), বৈধ বান্ডিল এবং ভিতরে বান্ডিল রয়েছে, উপরে জেএসওএন উপরে উল্লিখিত কী হিসাবে ডেটা থাকবে

এই দৃশ্যের জন্য, মান উত্তোলনের কোডটি এর মতো দেখতে পাবেন,

    if(getIntent()!=null){
            Bundle bundle = getIntent().getExtras();
            if (bundle != null) {
                try {
                   JSONObject object = new JSONObject(bundle.getStringExtra("data"));
String user_name = object.optString("user_name");

                } catch (JSONException e) {
                    e.printStackTrace();
                }


            }
        }

3

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

<?php
$url = "https://fcm.googleapis.com/fcm/send";
$token = "C-l6T_a7HouUK****";
$serverKey = "AAAAaOcKS00:********";
define( 'API_ACCESS_KEY', $serverKey );
$registrationIds = array($token);
// prep the bundle

$msg = array

(
 'message'  => 'here is a message. message',
 'title'        => 'This is a title. title',
 'subtitle' => 'This is a subtitle. subtitle',
 'tickerText'   => 'Ticker text here...Ticker text here...Ticker text 
 here',
 'vibrate'  => 1,
 'sound'        => 1,
 'largeIcon'    => 'large_icon',
 'smallIcon'    => 'small_icon'

);

$fields = array

(
  'registration_ids'    => $registrationIds,
  'data'            => $msg

);
$headers = array

(
  'Authorization: key=' . API_ACCESS_KEY,
 'Content-Type: application/json'

);


$ch = curl_init();

curl_setopt( $ch,CURLOPT_URL, 'https://android.googleapis.com/gcm/send' 
);

curl_setopt( $ch,CURLOPT_POST, true );

curl_setopt( $ch,CURLOPT_HTTPHEADER, $headers );

curl_setopt( $ch,CURLOPT_RETURNTRANSFER, true );

curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, false );

curl_setopt( $ch,CURLOPT_POSTFIELDS, json_encode( $fields ) );

$result = curl_exec($ch );

curl_close( $ch );

echo $result;

?>

এবং onMessageRe प्राप्त ডেটা ধরা

public class MyFirebaseMessagingService extends FirebaseMessagingService     {

  private static final String TAG = "MyFirebaseMsgService";

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    Log.d(TAG, "From: " + remoteMessage.getFrom());

    // Check if message contains a data payload.
    if (remoteMessage.getData().size() > 0) {
        Log.d(TAG, "Message data payload: " + remoteMessage.getData());

      sendNotification(remoteMessage.getData().get("message"));
     }
   // Check if message contains a notification payload.
    else if (remoteMessage.getNotification() != null) {
        Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
    sendNotification(remoteMessage.getNotification().getBody());
    }


}
   private void sendNotification(String messageBody) {
    Intent intent = new Intent(this, Notify.class).putExtra("msg",messageBody);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
            PendingIntent.FLAG_ONE_SHOT);

    String channelId = "idddd";
    Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    NotificationCompat.Builder notificationBuilder =
            new NotificationCompat.Builder(MyFirebaseMessagingService.this)
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setContentTitle("FCM Message")
                    .setContentText(messageBody)
                    .setAutoCancel(true)
                    .setSound(defaultSoundUri)
                    .setContentIntent(pendingIntent);

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

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

1
এটি কি একটি পটভূমি সঙ্গে কাজ করছে?
তাবিশ খান

@ তাবিশখান হ্যাঁ ভাই আপনি যদি কোন সমস্যা নিয়ে আমাকে নির্দ্বিধায় জিজ্ঞাসা করেন তবে এটি কাজ করছে .. ধন্যবাদ
অ্যান্ড্রয়েড সানাউল্লাহ

1
হাই @ অ্যান্ড্রয়েডসানাউল্লাহ, আপনি প্রথম অংশটি সার্ভার কোডটি ব্যাখ্যা করতে পারবেন, আপনি আসলে এটি কোথায় রেখেছেন, আমি একই সমস্যার মুখোমুখি হয়েছি তবে আমি সার্ভার অংশটি বেশ বুঝতে পারি না, আপনি কি পোস্টম্যান ব্যবহার করছেন?
শনি 22

অনুরোধের জন্য কার্ল ব্যবহার করা হয় এবং সমস্ত প্যারামিটার এতে পাস করা হয় @ @ শিড
অ্যান্ড্রয়েড সানাউল্লাহ

2

আপনার সার্ভারের অনুরোধ থেকে নোটিফিকেশন পেইড পুরোপুরি সরানকেবল ডেটা প্রেরণ করুন এবং এটি হ্যান্ডেল করুন onMessageReceived(), অন্যথায় onMessageReceivedঅ্যাপটি ব্যাকগ্রাউন্ডে বা নিহত হওয়ার পরে আপনার ট্রিগার করা হবে না।

আমি সার্ভার থেকে যা পাঠাচ্ছি তা এখানে:

{
  "data":{
    "id": 1,
    "missedRequests": 5
    "addAnyDataHere": 123
  },
  "to": "fhiT7evmZk8:APA91bFJq7Tkly4BtLRXdYvqHno2vHCRkzpJT8QZy0TlIGs......"
}

সুতরাং আপনি এইভাবে আপনার ডেটা গ্রহণ করতে পারেন onMessageReceived(RemoteMessage message): (আসুন আমি আইডি নিতে হবে বলে দিন)

Object obj = message.getData().get("id");
        if (obj != null) {
            int id = Integer.valueOf(obj.toString());
        }

এবং তেমনিভাবে আপনি সার্ভার থেকে যে কোনও ডেটা ভিতরে পাঠাতে পারেন onMessageReceived()


2

অ্যাপটি ব্যাকগ্রাউন্ড এবং ফোরগ্রাউন্ডে অনুসরণ অনুসারে বার্তা প্রেরণের সহজ উপায়: - এপিআই ব্যবহার করে কোনও বার্তা প্রেরণ করতে, আপনি অ্যাডভান্সড্রেস্ট ক্লায়েন্ট, এটির একটি ক্রোম এক্সটেনশন নামে একটি সরঞ্জাম ব্যবহার করতে পারেন এবং নিম্নলিখিত পরামিতিগুলির সাথে একটি বার্তা প্রেরণ করতে পারেন।

ক্লায়েন্ট সরঞ্জাম বিশিষ্ট লিঙ্ক: https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo

এই ইউআরএলটি ব্যবহার করুন: - https://fcm.googleapis.com/fcm/se সামগ্রী সামগ্রী প্রকার: অ্যাপ্লিকেশন / json অনুমোদন: কী = আপনার সার্ভার কী থেকে বা প্রমাণীকরণ কী (নীচে রেফারেট দেখুন)

{ "data": {
    "image": "https://static.pexels.com/photos/4825/red-love-romantic-flowers.jpg",
    "message": "Firebase Push Message Using API"
    "AnotherActivity": "True"
     },
  "to" : "device id Or Device token"
}

অনুমোদন কী গুগল বিকাশকারীদের কনসোল পরিদর্শন করে এবং আপনার প্রকল্পের বাম মেনুতে শংসাপত্র বোতামে ক্লিক করে প্রাপ্ত করা যেতে পারে। তালিকাভুক্ত API কীগুলির মধ্যে সার্ভার কী আপনার অনুমোদনের কী হবে।

এবং আপনাকে আপনার পোষ্ট অনুরোধের "থেকে" বিভাগে রিসিভারের টোকনআইডি লাগাতে হবে যা এপিআই ব্যবহার করে প্রেরণ করা হয়েছিল।


2

আপনি ব্যাকগ্রাউন্ডে মেসেজের রিসেপ্ট (রিমোটমেসেজ রিমোটমেসেজ) এ কাজ করতে চান এটি কেবল ডেটা পার্ট নোটিফিকেশন অংশটি প্রেরণ করুন:

"data":    "image": "",    "message": "Firebase Push Message Using API", 

"আরেকটি কার্যকলাপ": "সত্য", "থেকে": "ডিভাইস আইডি বা ডিভাইস টোকেন"

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

  public void onMessageReceived(RemoteMessage remoteMessage)
    if (remoteMessage.getData().size() > 0) 
    Log.d(TAG, "Message data payload: " + remoteMessage.getData());      

1

জুন 2018 উত্তর -

আপনাকে নিশ্চিত করতে হবে যে বার্তায় কোথাও কোনও "বিজ্ঞপ্তি" কীওয়ার্ড নেই। কেবলমাত্র "ডেটা" অন্তর্ভুক্ত করুন এবং ব্যাকগ্রাউন্ডে বা হত্যা করা হলেও অ্যাপটি onMessageRe प्राप्त বার্তাটি পরিচালনা করতে সক্ষম হবে।

মেঘ ফাংশন ব্যবহার:

const message = {
    token: token_id,   // obtain device token id by querying data in firebase
    data: {
       title: "my_custom_title",
       body:  "my_custom_body_message"
       }
    }


return admin.messaging().send(message).then(response => {
    // handle response
});

তারপরে আপনার onMessageRemitted () এ, আপনার ক্লাসে প্রসারিত com.google.firebase.messaging.FirebaseMessagingService:

if (data != null) {
  Log.d(TAG, "data title is: " + data.get("title");
  Log.d(TAG, "data body is: " + data.get("body");
}

// build notification using the body, title, and whatever else you want.

আপনার কি কোনও উত্স আছে, এটি নিরাপদ?
যোগেশ রাঠি

এটি নিরাপদ, আমি এটি আমার অ্যাপ্লিকেশনগুলিতে ব্যবহার করি। যাইহোক, পোস্ট করার 6 মাস পরে, আমি উত্সটি মনে করতে পারি না - আমি ধারণা করি এটি ফায়ারবেস ডকুমেন্টেশন।
জেফ প্যাজেট

1

OAUTH 2.0 অনুযায়ী:

এই ক্ষেত্রে বিউচিউস এফসিএম এখন OAUTH 2 ব্যবহার করে লেখার জন্য লেখকের সমস্যা হবে

সুতরাং আমি ফায়ারবেস ডকুমেন্টেশন পড়েছি এবং ডকুমেন্টেশন অনুসারে ডেটা বার্তা পোস্ট করার নতুন উপায় হ'ল;

POST: https://fcm.googleapis.com/v1/projects/YOUR_FIREBASEDB_ID/messages:send

শিরোলেখ

Key: Content-Type, Value: application/json

প্রমাণীকরণ

Bearer YOUR_TOKEN 

উদাহরণ বডি

{
   "message":{
    "topic" : "xxx",
    "data" : {
         "body" : "This is a Firebase Cloud Messaging Topic Message!",
         "title" : "FCM Message"
          }
      }
 }

ইউআরএলে ডেটাবেস আইডি রয়েছে যা আপনি এটি আপনার ফায়ারবেস কনসোলে খুঁজে পেতে পারেন। (প্রকল্প নিষ্পত্তির জন্য যান)

এবং এখন আমাদের টোকেন নিতে দিন (এটি কেবলমাত্র 1 ঘন্টা বৈধ হবে):

ফায়ারবেস কনসোলে প্রথমে সেটিংস> পরিষেবা অ্যাকাউন্ট খুলুন । জেনারেট নতুন প্রাইভেট কী ক্লিক করুন , নিরাপদে কী সম্বলিত JSON ফাইলটি সঞ্চয় করুন। সার্ভারের অনুরোধগুলি ম্যানুয়ালি অনুমোদনের জন্য আমার এই JSON ফাইলটি দরকার ছিল। আমি এটি ডাউনলোড করেছি।

তারপরে আমি একটি নোড.জেএস প্রকল্প তৈরি করেছি এবং আমার টোকেন পেতে এই ফাংশনটি ব্যবহার করেছি;

var PROJECT_ID = 'YOUR_PROJECT_ID';
var HOST = 'fcm.googleapis.com';
var PATH = '/v1/projects/' + PROJECT_ID + '/messages:send';
var MESSAGING_SCOPE = 'https://www.googleapis.com/auth/firebase.messaging';
var SCOPES = [MESSAGING_SCOPE];

  router.get('/', function(req, res, next) {
      res.render('index', { title: 'Express' });
      getAccessToken().then(function(accessToken) {
        console.log("TOKEN: "+accessToken)
      })

    });

function getAccessToken() {
return new Promise(function(resolve, reject) {
    var key = require('./YOUR_DOWNLOADED_JSON_FILE.json');
    var jwtClient = new google.auth.JWT(
        key.client_email,
        null,
        key.private_key,
        SCOPES,
        null
    );
    jwtClient.authorize(function(err, tokens) {
        if (err) {
            reject(err);
            return;
        }
        resolve(tokens.access_token);
    });
});
}

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


গৃহীত উত্তর কাজ করছে, barer টোকেন প্রমাণীকরণ উপায় না হয়, আপনি এই পড়া পিয়ন দিয়ে চেষ্টা করা প্রয়োজন: stackoverflow.com/questions/45309674/...
কার্লোস যীশু Arancibia Taborga

1

2019 সাল থেকে, গুগল ফায়ারবেস তাদের এপিআইগুলিতে একটি বড় পরিবর্তন এসেছে যার অর্থ: 'com.google.firebase:firebase-messaging:18.0.0'

18.0.0 এ সেগুলি সরিয়ে নিয়েছে MyFirebaseInstanceIDServiceএবং আপনাকে টোকেন দেওয়া MyFirebaseMessagingServiceদরকার যাতে আপনাকে কেবল লিখতে হবে:

@Override
public void onNewToken(String token) {
    Log.d(TAG, "Refreshed token: " + token);

}

এবং আপনার অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএলতেও আপনাকে সরাতে হবে:

<service android:name=".service.MyFirebaseInstanceIDService">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
        </intent-filter>
    </service>

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

কাস্টম ডিফল্ট আইকন এবং কাস্টম রঙ সেট করতে অ্যাপ্লিকেশন ট্যাগের মধ্যে এই লাইনগুলি যুক্ত করুন:

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

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

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

এখন একটি পটভূমি অ্যাপ্লিকেশনটিতে বিজ্ঞপ্তি বার্তাগুলি পরিচালনা করার জন্য আপনার প্রথম ক্রিয়াকলাপে এটি স্প্ল্যাশস্ক্রিন হলেও একটি উদ্দেশ্যকে সংজ্ঞায়িত করা উচিত, যখন আপনার অ্যাপ্লিকেশন ব্যাকগ্রাউন্ডে থাকে, অ্যান্ড্রয়েড সিস্টেম ট্রেতে বিজ্ঞপ্তি বার্তাগুলিকে নির্দেশ দেয়। বিজ্ঞপ্তিতে একটি ব্যবহারকারী ট্যাপ ডিফল্টভাবে অ্যাপ্লিকেশন লঞ্চারটি খুলবে।

উদাহরণস্বরূপ, যদি আপনার জেসন এটির মতো হয়:

 "data": {
"message": "2",
"title": "1",
"pushType" : "banner",
"bannerLink": "http://www.google.com",
"image" : "https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png"}

এই মানগুলি পেতে আপনার কেবল একটি সাধারণ অভিপ্রায় লিখতে হবে:

        Bundle extras = intent.getExtras();
        String bannerLink = extras.getString("bannerLink");
        ...
        String channelId = extras.getString("channelId");

0

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

এক্ষেত্রে অ্যাপের পটভূমির পরিস্থিতি পরীক্ষা করতে আপনাকে আপনার পিছনের শেষের প্রশাসক কনসোলটি বেছে নিতে হবে।

এখানে, আপনি আপনার পুশ বান্ডেলে 'ডেটা' কী যুক্ত করবেন। সুতরাং, প্রত্যাশার মতো বিস্তারিত ধাক্কা দেখানো হবে। আশা করি এটি কিছুটা সাহায্য করবে।


0

এই কোডটি ব্যবহার করে আপনি পটভূমিতে / অগ্রভাগে বিজ্ঞপ্তিটি পেতে পারেন এবং পদক্ষেপও রাখতে পারেন:

//Data should come in this format from the notification
{
  "to": "/xyz/Notifications",
  "data": {
      "key1": "title notification",
      "key2": "description notification"
  }
}

অ্যাপ-এ এই কোডটি ব্যবহার করুন:

  @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
      String key1Data = remoteMessage.getData().get("key1");
      // use key1Data to according to your need
    }

// তথ্য এই ফর্ম্যাটে notification "থেকে": "/" xyz / বিজ্ঞপ্তি "," ডেটা ": {" কী 1 ":" শিরোনাম বিজ্ঞপ্তি "," কী 2 ":" বিবরণ বিজ্ঞপ্তি "থেকে লিখতে হবে} to কীভাবে লিখবেন এই কোড পিএইচপি পরিষেবা?
তাবিশ খান

-3

দুটি ধরণের বিজ্ঞপ্তি থাকবে

  1. প্রদর্শন বিজ্ঞপ্তি - কেবল প্রদর্শন বিজ্ঞপ্তিগুলি, কেবল অ্যাপ্লিকেশনটি খোলা নেই এবং এটি অ্যাপ স্ট্যাকের মধ্যে প্রদর্শিত হবে।
  2. ডেটা নোটিফিকেশন - কলব্যাক ফায়ারব্যাসেমেসেজারওয়াসিসের অনেসেসরিজড পদ্ধতিতে যাবে এবং অ্যাপটি ব্যাকগ্রাউন্ড, অগ্রভূমি বা নিহত অবস্থায় থাকলে এটি কাজ করে।

অ্যাপটি ব্যাকগ্রাউন্ডে থাকা অবস্থায় আপনাকে অবশ্যই বিজ্ঞপ্তিটি হ্যান্ডেল করতে ডেটা বিজ্ঞপ্তি ব্যবহার করতে হবে।


-5

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

* লাইব্রেরি https://github.com/erdalceylan/com-google-firebase-messaging

 dependencies {
        compile 'com.google.firebase:firebase-core:11.2.0'
        compile 'com.github.erdalceylan:com-google-firebase-messaging:v1-11.2.0'
    }

*

@WorkerThread
public void onMessageReceived(RemoteMessage var1) {
  //your app is in background or foreground all time calling
}

আশা সাহায্য করে। শুভকামনা


2
দরকারী উত্তর নয়
অঙ্কিত পাতিদার

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