एंड्रॉइड अधिसूचना ध्वनि कैसे खेलें


169

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

MediaPlayer mp = new MediaPlayer();
mp.reset();
mp.setDataSource(notificationsPath+ (String) apptSounds.getSelectedItem());
mp.prepare();
mp.start();

जवाबों:


421

अगर किसी को अभी भी इसके समाधान की तलाश में है, तो मुझे एंड्रॉइड में रिंगटोन / अलार्म ध्वनि को चलाने के लिए एक उत्तर मिला

try {
    Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
    r.play();
} catch (Exception e) {
    e.printStackTrace();
}

आप TYPE_NOTIFICATION को TYPE_ALARM में बदल सकते हैं, लेकिन आप इसे चलाने से रोकने के लिए अपने रिंगटोन्स पर नज़र रखना चाहेंगे ... जब उपयोगकर्ता किसी बटन या किसी चीज़ पर क्लिक करता है।


2
उदाहरण के लिए मोटोरोला फोन ने वरीयताओं की गतिविधि को बढ़ाया और उपयोगकर्ता को एसएमएस और अन्य श्रेणियों के लिए एक अधिसूचना ध्वनि को परिभाषित करने की अनुमति देता है। उपरोक्त विधि इस प्रकार के फोन के साथ काम नहीं करेगी। क्या आपके पास इस मुद्दे को हल करने का कोई विचार है?
डेविड

2
मैं इस के साथ एक त्रुटि मिली: MediaPlayer - Should have subtitle controller already set। इसका क्या मतलब है?
Deqing

इस समाधान का उपयोग करते हुए, 28/29 बार के बाद, ध्वनियाँ बजना बंद हो जाती हैं। किसी को पता है क्यों?
बजे टॉम ब्रिंककेम्पर

1
आप हर अपवाद को क्यों पकड़ते हैं? कौन सा फेंका जा सकता है?
मिह_x64

2
@ मेम, हाँ। stackoverflow.com/q/39876885/2614353 . स्वाभाविक रूप से, हर बार इसे खेलने के लिए रिंगटोन ऑब्जेक्ट न बनाएं। इसे एक बार बनाएं, और फिर एक ही ऑब्जेक्ट को कई बार चलाएं।
टॉम ब्रिंककेम्पर

205

अब आप ध्वनि को शामिल करके ऐसा कर सकते हैं जब ध्वनि को अलग से कॉल करने के बजाय एक सूचना का निर्माण किया जाए।

//Define Notification Manager
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

//Define sound URI
Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(getApplicationContext())
        .setSmallIcon(icon)
        .setContentTitle(title)
        .setContentText(message)
        .setSound(soundUri); //This sets the sound to play

//Display notification
notificationManager.notify(0, mBuilder.build());

12
यह एक अलग समस्या हल करता है - "कैसे एक अधिसूचना ध्वनि खेलने के लिए", लेकिन "अधिसूचना कैसे खेलें और ध्वनि कैसे प्रदर्शित करें"। इसके समाधान में स्वीकृत उत्तर उचित है।
फाबियान टैम्प

7
शायद आपको इसे STREAM_NOTIFICATION के माध्यम से खेलने के लिए भी सेट करना चाहिए ताकि यह OS वर्तमान सूचना वॉल्यूम वरीयता के साथ खेला जाए: .setSound (soundUri, AudioManager.STREAM_NOTIFICATION)
mwk

@ रोब पहेली यह ठीक काम कर रहा है। लेकिन कई सूचनाओं के मामले में, जैसे 100 अधिसूचनाएं समानांतर ध्वनि अगली अधिसूचना ध्वनि के साथ मिश्रित हो जाती हैं। तार्किक रूप से अगर ध्वनि पहले से ही बज रही है तो उसे पिछले नाटक के पूरा होने का इंतजार करना चाहिए। क्या आप इस परिदृश्य में मदद कर सकते हैं?
वकास अली रज्जाक

ऐप में बैकग्राउंड होने पर साउंड नहीं बजा। कोई उपाय?
सागर नायक

47

यदि आप चाहते हैं कि एक डिफ़ॉल्ट सूचना ध्वनि बजाया जाए, तो आप सेटडफ़ॉल्ट्स (int)NotificationCompat.Builder वर्ग की विधि का उपयोग कर सकते हैं :

NotificationCompat.Builder mBuilder =
        new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.ic_notification)
                .setContentTitle(getString(R.string.app_name))
                .setContentText(someText)
                .setDefaults(Notification.DEFAULT_SOUND)
                .setAutoCancel(true);

मेरा मानना ​​है कि अपने काम को पूरा करने का सबसे आसान तरीका है।


ऐप में बैकग्राउंड होने पर साउंड नहीं बजा। कोई उपाय?
सागर नायक

13

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

public void ringtone(){
    try {
        Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
        r.play();
     } catch (Exception e) {
         e.printStackTrace();
     }
}

9

आपके प्रश्न के कुछ समय हो गए हैं, लेकिन ... क्या आपने ऑडियो स्ट्रीम प्रकार सेट करने का प्रयास किया है?

mp.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);

यह तैयारी से पहले किया जाना चाहिए।


2

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

हालाँकि, अधिसूचना API की थोड़ी सी ट्विकिंग और आप जो चाहें उसके करीब पहुँच सकते हैं। आप एक रिक्त सूचना प्रदर्शित कर सकते हैं और फिर कुछ सेकंड के बाद अपने आप हटा सकते हैं। मुझे लगता है कि यह मेरे लिए काम करेगा; शायद यह आपके लिए काम करेगा।

मैंने ऐसी सुविधा विधियों का एक सेट बनाया है com.globalmentor.android.app.Notifications.javaजिसमें आप इस तरह से एक अधिसूचना ध्वनि बना सकते हैं:

Notifications.notify(this);

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

इस बिंदु पर आप महसूस कर सकते हैं कि, चूंकि अधिसूचना किसी भी तरह से चली जाएगी, इसलिए आपके पास सूचना पट्टी में एक स्क्रॉल टिकर संदेश हो सकता है; आप ऐसा कर सकते हैं:

Notifications.notify(this, 5000, "This text will go away after five seconds.");

इस वर्ग में कई अन्य सुविधा विधियाँ हैं। आप पूरी लाइब्रेरी को इसके सबवर्सन रिपॉजिटरी से डाउनलोड कर सकते हैं और इसे मावेन के साथ बना सकते हैं। यह वैश्वीकरण-कोर लाइब्रेरी पर निर्भर करता है, जिसे मावेन के साथ भी बनाया और स्थापित किया जा सकता है।


यह जटिल है बस एक ध्वनि खेलने के लिए जटिल है। आप बस यह कर सकते हैं: stackoverflow.com/a/9622040/1417267
slinden77

1

आप जिस अधिसूचना को चाहते हैं उसे प्रदर्शित करने के लिए अधिसूचना और अधिसूचना प्रबंधक का उपयोग कर सकते हैं। फिर आप उस ध्वनि को अनुकूलित कर सकते हैं जिसे आप अपनी अधिसूचना के साथ खेलना चाहते हैं।


5
मैं एक अधिसूचना प्रदर्शित करना नहीं चाहता, मैं केवल ध्वनि बजाना चाहता हूं।
नन्जसेन

1

मुझे लगता है कि "अधिसूचना ध्वनि" की अवधारणा एंड्रॉइड यूआई के लिए गलत है।

एंड्रॉइड अपेक्षित व्यवहार उपयोगकर्ता को सचेत करने के लिए मानक अधिसूचना का उपयोग करना है। यदि आप स्टेटस बार आइकन के बिना एक सूचना ध्वनि खेलते हैं, तो आप उपयोगकर्ता को भ्रमित करते हैं ("वह ध्वनि क्या थी? यहाँ कोई आइकन नहीं है, शायद मुझे सुनने में समस्या है?")।

अधिसूचना पर ध्वनि कैसे सेट करें, उदाहरण के लिए, यहां: अधिसूचना के लिए ध्वनि सेट करना


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

ठीक है, आप सही हैं लेकिन यह दूसरी बात है। मैं बात कर रहा था (यह मानते हुए कि यह "सिस्टम नोटिफिकेशन साउंड्स" का प्रश्न था), यह सिस्टम एंड्रॉइड GUI पर है। बेशक, जब आप अपने खुद के ऐप में होते हैं, जैसा कि आप सभी के लिए है।
विचार 01

1
Intent intent = new Intent(this, MembersLocation.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intent.putExtra("type",type);
    intent.putExtra("sender",sender);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
            PendingIntent.FLAG_ONE_SHOT);

    String channelId = getString(R.string.default_notification_channel_id);

    Uri Emergency_sound_uri=Uri.parse("android.resource://"+getPackageName()+"/raw/emergency_sound");
   // Uri Default_Sound_uri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    if(type.equals("emergency"))
    {
        playSound=Emergency_sound_uri;
    }
    else
    {
        playSound= Settings.System.DEFAULT_NOTIFICATION_URI;
    }

    NotificationCompat.Builder notificationBuilder =
            new NotificationCompat.Builder(this, channelId)
                    .setSmallIcon(R.drawable.ic_notification)
                    .setContentTitle(title)
                    .setContentText(body)
                    .setSound(playSound, AudioManager.STREAM_NOTIFICATION)
                    .setAutoCancel(true)
                    .setColor(getColor(R.color.dark_red))
                    .setPriority(NotificationCompat.PRIORITY_HIGH)
                    .setContentIntent(pendingIntent);

   // notificationBuilder.setOngoing(true);//for Android notification swipe delete disabling...

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

    // Since android Oreo notification channel is needed.
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        NotificationChannel channel = new NotificationChannel(channelId,
                "Channel human readable title",
                NotificationManager.IMPORTANCE_HIGH);
        AudioAttributes att = new AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_NOTIFICATION)
                .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
                .build();
        channel.setSound(Emergency_sound_uri, att);
        if (notificationManager != null) {
            notificationManager.createNotificationChannel(channel);
        }
    }

    if (notificationManager != null) {
        notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
    }
}

1
इस कोड स्निपेट के लिए धन्यवाद, जो कुछ सीमित, तत्काल सहायता प्रदान कर सकता है। एक उचित व्याख्या यह दर्शाती है कि यह समस्या का एक अच्छा समाधान क्यों है, यह दिखा कर इसके दीर्घकालिक मूल्य में बहुत सुधार होगा और यह भविष्य के पाठकों को अन्य, समान प्रश्नों के साथ और अधिक उपयोगी बना देगा। कृपया कुछ स्पष्टीकरण जोड़ने के लिए अपने उत्तर को संपादित करें, जिसमें आपके द्वारा की गई धारणाएँ शामिल हैं।
नोह

0

सूचना चैनल पर ध्वनि सेट करें

        Uri alarmUri = Uri.fromFile(new File(<path>));

        AudioAttributes attributes = new AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_ALARM)
                .build();

        channel.setSound(alarmUri, attributes);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.