Android में फायरबेस से अधिसूचना भेजते समय कोई सूचना ध्वनि नहीं


83

मैं अपने Android एप्लिकेशन को फायरबेस से पुश सूचना भेज रहा हूं। लेकिन जब मेरा ऐप बैकग्राउंड फायरबेस पर है। मेसेजेज रीसेसेड मेथड को कॉल नहीं किया जाता है, बजाय इसके कि फायर ट्रे को सिस्टम ट्रे में नोटिफिकेशन दिखाने के लिए सिस्टम को नोटिफिकेशन भेजें। नोटिफिकेशन सिस्टम ट्रे में दिखाई देता है, लेकिन नोटिफिकेशन के लिए कोई साउंड नहीं है, यहां तक ​​कि मैंने सिस्टम सेटिंग्स में अपने ऐप के लिए नोटिफिकेशन साउंड की भी अनुमति नहीं दी है।

जब फायरबेस से सूचना प्राप्त होती है तो मैं सूचना ध्वनि चलाने के लिए क्या कर सकता हूं।

यह है कि मैं अपने ऐप ब्लॉगपोस्ट लिंक से फायरबेस से अधिसूचना कैसे भेज रहा हूं

अपने Android एप्लिकेशन में फायरबेस कैसे जोड़ें


1
कृपया इस उत्तर को देखें ..
geekoraul

उस ऐप के लिए नोटिफिकेशन सेटिंग्स को
ज़रूर देखें

@ विकास: आपका लिंक चला गया है !! (developine.com / ...)
अनह गुयेन

जवाबों:


114

अधिसूचना के पेलोड में ध्वनि कुंजी है।

आधिकारिक प्रलेखन से इसका उपयोग है:

डिवाइस द्वारा सूचना मिलने पर बजने के लिए एक ध्वनि इंगित करता है। ऐप में बंडल किए गए ध्वनि संसाधन के डिफ़ॉल्ट या फ़ाइल नाम का समर्थन करता है। ध्वनि फ़ाइलों को / res / कच्चे / में निवास करना चाहिए।

जैसे:

{
    "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",

    "notification" : {
      "body" : "great match!",
      "title" : "Portugal vs. Denmark",
      "icon" : "myicon",
      "sound" : "mySound"
    }
  }

यदि आप डिवाइस की डिफ़ॉल्ट ध्वनि का उपयोग करना चाहते हैं, तो आपको उपयोग करना चाहिए: "sound": "default" :।

पेलोड में सभी संभावित कुंजियों के लिए यह लिंक देखें: https://firebase.google.com/docs/cloud-messaging/http-server-ref#notification-payload-support

उन लोगों के लिए जो फायरबेस को नहीं जानते हैं, जब ऐप बैकग्राउंड में होता है तो अलग से नोटिफिकेशन संभालता है। इस स्थिति में onMessageReceived फ़ंक्शन को नहीं कहा जाता है।

जब आपका ऐप बैकग्राउंड में होता है, तो एंड्रॉइड नोटिफिकेशन मैसेज को सिस्टम ट्रे में भेज देता है। अधिसूचना पर एक उपयोगकर्ता टैप डिफ़ॉल्ट रूप से ऐप लॉन्चर खोलता है। इसमें वे संदेश शामिल हैं जिनमें अधिसूचना और डेटा पेलोड दोनों शामिल हैं। इन मामलों में, अधिसूचना डिवाइस के सिस्टम ट्रे में पहुंचाई जाती है, और डेटा पेलोड को आपके लॉन्चर गतिविधि के इरादे के अतिरिक्त में वितरित किया जाता है।


23
यदि आप डिवाइस की डिफ़ॉल्ट ध्वनि का उपयोग करना चाहते हैं, तो आपको उपयोग करना चाहिए: "ध्वनि": "डिफ़ॉल्ट"
ब्रायन Vo

@TranVo इस बिंदु के लिए धन्यवाद कि "डिफ़ॉल्ट" मान डिवाइस की डिफ़ॉल्ट ध्वनि निभाता है, आपने मुझे बहुत समय बचाया!
मटिया रुग्गिएरो

1
मैंने सभी संभव तरीकों की कोशिश की, लेकिन अपने स्वयं के स्वर को स्थापित करने से उस डिफ़ॉल्ट ध्वनि या ध्वनि को सक्षम नहीं किया और यह भी कंपन नहीं हो रहा है कि क्या कारण हो सकता है
santhosh

1
तो मैं अधिसूचना की ध्वनि को कैसे अक्षम कर सकता हूं?
Iamatsundere181

1
क्या नई अधिसूचना चैनल प्रणाली ने पुराने उपकरणों के लिए इस एपीआई का पालन किया है, या यह अभी भी पुराने उपकरणों के लिए काम करता है? मैं एक नूगा डिवाइस के लिए कस्टम साउंड शो करने की कोशिश कर रहा हूं, लेकिन मुझे लगता है कि मुझे "साउंड" या "साउंडनेम" में कोई फर्क नहीं पड़ता कि मुझे डिफ़ॉल्ट चाइम साउंड इफ़ेक्ट मिल रहा है। मैंने "mysoundeffect.wav" और "mysoundeffect" को बिना किसी भाग्य के आज़माया है।
जॉन गोरेनफेल्ड

26

खोले गए विकल्पसंदेश लिखते समय उन्नत विकल्प चुनें , और ध्वनि सक्रिय चुनें सक्रिय चुनें

यह मेरा समाधान है


@ एंड्रॉइड 8 और इसके बाद के संस्करण में, यह हमेशा फायरबेस कंसोल की कोई बात नहीं करता है। क्या आप ध्वनि को पूरी तरह से रोकने का एक तरीका जानते हैं?
दो बार सोचें कोड एक बार

मुझे इतनी देर से यह देखने के लिए खेद है, मैं इस समस्या को हल नहीं कर सकता। @ दो बार सोचें कोड
KongJing

24

इसे इस्तेमाल करे

{
    "to" : "DEVICE-TOKEN",

    "notification" : {
      "body"  : "NOTIFICATION BODY",
      "title" : "NOTIFICATION TITILE",
      "sound" : "default"
    }
  }

@ नोटिफिकेशन कस्टम साउंड के लिए: -> "sound" : "MyCustomeSound.wav"


1
तो आप उस फ़ाइल को कहाँ रखते हैं? कच्चे में संपत्ति?
हम्जेह सोबोह

3
संपत्ति फ़ोल्डर नहीं, रेस के तहत एक नया फ़ोल्डर बनाएं, इसे कच्चा कहें। फिर अपने wav या mp3 फाइल को उस फोल्डर में कॉपी और पेस्ट करें। @ HamzehSoboh
सहयोगी Makongo

मैं एंड्रॉइड ऐप में /res/raw/my_sound.mp3 में ध्वनि डालता हूं, फिर "ध्वनि": "my_sound.mp3" के साथ एपीआई कॉल करता हूं। काम नहीं कर रहा, बस डिफॉल्ट साउंड बजाया गया :( कोई भी मेरे जैसा?
Anh Nguyen

ओह, मैं इसे काम करता हूं। एंड्रॉइड नोटिफिकेशन चैनल का उपयोग करना, यहां और अधिक विवरण: stackoverflow.com/questions/61142155/…
Anh Nguyen

12

onMessageReceived विधि केवल तभी निकाल दी जाती है जब ऐप अग्रभूमि में होता है या अधिसूचना पेलोड में केवल डेटा प्रकार होता है।

से Firebase डॉक्स

डाउनस्ट्रीम मैसेजिंग के लिए, FCM दो प्रकार का पेलोड प्रदान करता है: सूचना और डेटा

के लिए अधिसूचना प्रकार, FCM स्वचालित रूप से क्लाइंट ऐप की ओर से अंतिम-उपयोगकर्ता उपकरणों के लिए संदेश प्रदर्शित करता है। अधिसूचना में उपयोगकर्ता-दृश्यमान कुंजी का पूर्वनिर्धारित सेट होता है।
के लिए डेटा प्रकार, क्लाइंट ऐप डाटा प्रोसेसिंग के संदेशों के लिए जिम्मेदार है। डेटा संदेशों में केवल कस्टम कुंजी-मूल्य जोड़े होते हैं।

जब आप FCM को अपने क्लाइंट ऐप की ओर से सूचना प्रदर्शित करने से निपटना चाहते हैं तो सूचनाओं का उपयोग करें । जब आप अपने ऐप को डिस्प्ले को हैंडल करना चाहते हैं या अपने एंड्रॉइड क्लाइंट ऐप पर संदेशों को प्रोसेस करना चाहते हैं, या यदि आप प्रत्यक्ष एफसीएम कनेक्शन होने पर आईओएस डिवाइस पर संदेश भेजना चाहते हैं, तो डेटा संदेशों का उपयोग करें

डॉक्स के आगे

संदेश प्राप्त करते समय ऐप व्यवहार , जिसमें अधिसूचना और डेटा पेलोड दोनों शामिल हैं, यह निर्भर करता है कि ऐप पृष्ठभूमि में है या अग्रभूमि में- अनिवार्य रूप से, यह प्राप्ति के समय सक्रिय है या नहीं।
जब पृष्ठभूमि में , एप्लिकेशन सूचना ट्रे में सूचना पेलोड प्राप्त करते हैं, और उपयोगकर्ता द्वारा अधिसूचना पर टैप करने पर केवल डेटा पेलोड को संभालते हैं।
अग्रभूमि में होने पर , आपके एप्लिकेशन को दोनों पेलोड के साथ एक संदेश वस्तु मिलती है।

यदि आप सूचना भेजने के लिए फायरबेस कंसोल का उपयोग कर रहे हैं, तो पेलोड में हमेशा अधिसूचना प्रकार होगा। आपको सूचना पेलोड में केवल डेटा प्रकार के साथ सूचना भेजने के लिए फायरबेस एपीआई का उपयोग करना होगा। इस तरह आपके ऐप को हमेशा एक नया नोटिफिकेशन मिलने पर सूचित किया जाता है और ऐप नोटिफिकेशन पेलोड को हैंडल कर सकता है।

यदि आप पारंपरिक विधि का उपयोग करते समय पृष्ठभूमि में अधिसूचना ध्वनि खेलना चाहते हैं, तो आपको ध्वनि पैरामीटर को अधिसूचना पेलोड में जोड़ना होगा


नाह, इसे तब भी कहा जाता है जब ऐप बंद हो जाता है लेकिन यू को ऐप को ऑटो स्टार्ट करना चाहिए।
फंकी-एनडी

10

HTTP v1 एपीआई के साथ यह अलग है

प्रलेखन

उदाहरण:

{
 "message":{
    "topic":"news",
    "notification":{
       "body":"Very good news",
       "title":"Good news"
    },
    "android":{
       "notification":{
          "body":"Very good news",
          "title":"Good news",
          "sound":"default"
       }
    }
  }
}

इसे php में कैसे लिखें?
तबीश खान

@ ताबिशखान$this->message['message']['android']['notification']['sound'] = "default";
सूडोप्लज

7

मुझे उन नोटिफिकेशन में भी समस्या आ रही थी, जिन्हें साउंड का उत्सर्जन करना पड़ता था, जब ऐप अग्रभूमि में था, सब कुछ सही ढंग से काम करता था, हालाँकि जब ऐप बैकग्राउंड में था तब साउंड बस बाहर नहीं आया था।

सर्वर द्वारा एफसीएम के माध्यम से अधिसूचना भेजी गई थी, अर्थात सर्वर ने अधिसूचना के JSON पर आरोहित किया और इसे FCM को भेज दिया, जो तब एप्लिकेशन को अधिसूचना भेजता है। अगर मैं साउंड टैग लगाता हूं, तो भी ध्वनि बैकगाउंड में नहीं निकलती है।

यहाँ छवि विवरण दर्ज करें

यहां तक ​​कि ध्वनि टैग लगाने से भी काम नहीं चला।

यहाँ छवि विवरण दर्ज करें

इतनी खोज के बाद मुझे इसका समाधान एक गितुब मंच पर मिला। मैंने तब देखा कि मेरे मामले में दो समस्याएं थीं:

1 - यह एपीआई स्तर 26+ में काम करने के लिए महत्वपूर्ण, channel_id टैग भेजने के लिए गायब था

यहाँ छवि विवरण दर्ज करें

2 - एंड्रॉइड एप्लिकेशन में, इस विशिष्ट मामले के लिए जहां सर्वर से सीधे सूचनाएं भेजी जा रही थीं, मुझे पहले से चैनल आईडी को कॉन्फ़िगर करना था, इसलिए मेरी मुख्य गतिविधि में मुझे चैनल को कॉन्फ़िगर करना पड़ा ताकि एंड्रॉइड को पता हो कि कब क्या करना है अधिसूचना आ गई।

सर्वर द्वारा भेजे गए JSON में:

   {
  "title": string,
  "body": string,
  "icon": string,
  "color": string,
  "sound": mysound,

  "channel_id": videocall,
  //More stuff here ...
 }

आपकी मुख्य गतिविधि में:

 @Background
    void createChannel(){
            Uri sound = Uri.parse("android.resource://" + getApplicationContext().getPackageName() + "/" + R.raw.app_note_call);
            NotificationChannel mChannel;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                mChannel = new NotificationChannel("videocall", "VIDEO CALL", NotificationManager.IMPORTANCE_HIGH);
                mChannel.setLightColor(Color.GRAY);
                mChannel.enableLights(true);
                mChannel.setDescription("VIDEO CALL");
                AudioAttributes audioAttributes = new AudioAttributes.Builder()
                        .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                        .setUsage(AudioAttributes.USAGE_ALARM)
                        .build();
                mChannel.setSound(sound, audioAttributes);

                NotificationManager notificationManager =
                        (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
                notificationManager.createNotificationChannel(mChannel);
            }
    }

इससे आखिरकार मेरी समस्या हल हो गई, मुझे आशा है कि यह किसी को 2 दिन बर्बाद करने में मदद नहीं करेगा जैसे मैंने किया। मुझे नहीं पता कि यह मेरे द्वारा कोड में रखी गई सभी चीजों के लिए आवश्यक है, लेकिन यह तरीका है। मुझे अब उत्तर का श्रेय देने के लिए जीथब फोरम लिंक नहीं मिला, क्योंकि मैंने जो किया वह वही था जो वहां पोस्ट किया गया था।


2

इसे अवश्य पसंद करें

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {

    //codes..,.,,

    Uri sound= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        builder.setSound(sound);

}

6
जब ऐप बैकग्राउंड में हो तो onMessageReceived को नहीं कहा जाता है। वास्तव में यह वह समस्या है जिसका मैं सामना कर रहा हूं
विकासशील

क्या आपने इसे (Firebase.setAndroidContext (getApplicationContext ());) मुख्य गतिविधि से
AAA

नहीं मैं havent लेकिन अब मैं isl से अधिसूचना जवाब खेल रहा हूँ मेरे लिए काम किया।
विकासशील

कृपया मुझे बताएं कि बिल्डर जनरेट त्रुटि है कृपया बिल्डर को परिभाषित करें
आशीष शाही

बिल्डर
AAA

1

इसे इस्तेमाल करे....

  public  void buildPushNotification(Context ctx, String content, int icon, CharSequence text, boolean silent) {
    Intent intent = new Intent(ctx, Activity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent pendingIntent = PendingIntent.getActivity(ctx, 1410, intent, PendingIntent.FLAG_ONE_SHOT);

    Bitmap bm = BitmapFactory.decodeResource(ctx.getResources(), //large drawable);

    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(ctx)
            .setSmallIcon(icon)
            .setLargeIcon(bm)
            .setContentTitle(content)
            .setContentText(text)
            .setAutoCancel(true)
            .setContentIntent(pendingIntent);

    if(!silent)
       notificationBuilder.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION));

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

        notificationManager.notify(1410, notificationBuilder.build());
    }

और onMessageReceived, इसे कॉल करें

 @Override
public void onMessageReceived(RemoteMessage remoteMessage) {


    Log.d("Msg", "Message received [" + remoteMessage.getNotification().getBody() + "]");

    buildPushNotification(/*your param*/);
}

या KongJing का पालन करें , जैसा कि वह कहता है, सही है, लेकिन आप फायरबेस कंसोल का उपयोग कर सकते हैं।


0

अगर मैं इसे फायरबेस कंसोल से भेजता हूं तो भी मैं नोटिफिकेशन साउंड प्ले करने में सक्षम हूं। ऐसा करने के लिए आपको अग्रिम विकल्प में मूल्य "डिफ़ॉल्ट" के साथ कुंजी "ध्वनि" जोड़ना होगा।


आपका आइडिया काम कर रहा है लेकिन मुझे आवश्यक है कि जब फोन लॉक हो तो नोटिफिकेशन इमेज बदलने के लिए मैं कैसे बदल सकता हूं कृपया मेरी मदद करें
आशीष शाही

मेरी कोशिश है कि आप पिछले आइडिया पर काम न करें, कृपया मदद करें यह बहुत जरूरी है
आशीष शाही
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.