Jak odtworzyć dźwięk powiadomienia Androida


169

Zastanawiałem się, jak mogę odtworzyć dźwięk powiadomienia bez odtwarzania go w strumieniu multimediów. Teraz mogę to zrobić za pomocą odtwarzacza multimedialnego, jednak nie chcę, aby był odtwarzany jako plik multimedialny, chcę, aby był odtwarzany jako powiadomienie, alert lub dzwonek. oto przykład tego, jak wygląda teraz mój kod:

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

Odpowiedzi:


421

Jeśli ktoś nadal szuka rozwiązania tego problemu, to znalazłem odpowiedź na stronie Jak odtworzyć dźwięk dzwonka / alarmu w Androidzie

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

Możesz zmienić TYPE_NOTIFICATION na TYPE_ALARM, ale będziesz chciał śledzić swój dzwonek r, aby przestać go odtwarzać ... powiedzmy, kiedy użytkownik kliknie przycisk lub coś.


2
Na przykład telefony Motorola rozszerzyły działanie preferencji i pozwalają użytkownikowi zdefiniować dźwięk powiadomienia dla smsów i innych kategorii. Powyższa metoda nie będzie działać z tego typu telefonami. Czy masz pomysł, jak rozwiązać ten problem?
David

2
Mam błąd z tym: MediaPlayer - Should have subtitle controller already set. Co to znaczy?
Deqing

Korzystając z tego rozwiązania, po 28/29 razy dźwięki przestają grać. Czy ktoś wie, dlaczego?
Tom Brinkkemper

1
Dlaczego łapiesz każdy wyjątek? Który można rzucić?
Miha_x64

2
@Sam, Yes. stackoverflow.com/q/39876885/2614353. Zasadniczo nie twórz obiektu RingTone za każdym razem, gdy go odtwarzasz. Utwórz go raz, a następnie odtwórz ten sam obiekt wiele razy.
Tom Brinkkemper

205

Możesz to teraz zrobić, dołączając dźwięk podczas tworzenia powiadomienia, zamiast wywoływać dźwięk osobno.

//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
To rozwiązuje inny problem - nie „jak odtworzyć dźwięk powiadomienia”, ale „jak odtworzyć powiadomienie i wyświetlić dźwięk”. Przyjęta odpowiedź jest uzasadniona w swoim rozwiązaniu.
Fabian Tamp

7
Być może powinieneś również ustawić to na odtwarzanie przez STREAM_NOTIFICATION, aby było odtwarzane z bieżącymi preferencjami głośności powiadomień systemu operacyjnego: .setSound (soundUri, AudioManager.STREAM_NOTIFICATION)
mwk

@Rob Riddle Działa dobrze. ale w przypadku wielu powiadomień, np. 100 powiadomień równolegle, dźwięk jest mieszany z następnym dźwiękiem powiadomienia. logicznie rzecz biorąc, jeśli dźwięk jest już odtwarzany, powinien poczekać na zakończenie poprzedniego odtwarzania. Czy możesz pomóc w tym scenariuszu?
Waqas Ali Razzaq

nie odtwarza dźwięku, gdy aplikacja działa w tle. jakieś sugestie?
Sagar Nayak

47

Jeśli chcesz, aby odtwarzany był domyślny dźwięk powiadomienia, możesz użyć metody klasy setDefaults (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);

Uważam, że to najłatwiejszy sposób na wykonanie zadania.


nie odtwarza dźwięku, gdy aplikacja działa w tle. jakieś sugestie?
Sagar Nayak

13

Spróbuj tego:

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

Minęło trochę czasu od twojego pytania, ale ... Czy próbowałeś ustawić typ strumienia audio?

mp.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);

Należy to zrobić przed przygotowaniem.


2

Miałem mniej więcej to samo pytanie. Po kilku badaniach myślę, że jeśli chcesz odtworzyć domyślny systemowy „dźwięk powiadomienia”, w zasadzie musisz wyświetlić powiadomienie i nakazać mu użycie domyślnego dźwięku. I jest coś do powiedzenia na temat argumentu w niektórych innych odpowiedziach, że jeśli odtwarzasz dźwięk powiadomienia, powinieneś również przedstawić komunikat powiadomienia.

Jednak trochę poprawiając interfejs API powiadomień i możesz zbliżyć się do tego, co chcesz. Możesz wyświetlić puste powiadomienie, a następnie usunąć je automatycznie po kilku sekundach. Myślę, że to zadziała dla mnie; może to zadziała dla Ciebie.

Stworzyłem zestaw wygodnych metod, com.globalmentor.android.app.Notifications.javadzięki którym możesz stworzyć dźwięk powiadomienia w następujący sposób:

Notifications.notify(this);

Dioda LED również będzie migać, a jeśli masz pozwolenie na wibracje, wystąpią wibracje. Tak, ikona powiadomienia pojawi się na pasku powiadomień, ale zniknie po kilku sekundach.

W tym momencie możesz zdać sobie sprawę, że skoro powiadomienie i tak zniknie, równie dobrze możesz mieć przewijany komunikat na pasku powiadomień; możesz to zrobić w ten sposób:

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

W tej klasie istnieje wiele innych wygodnych metod. Możesz pobrać całą bibliotekę z repozytorium Subversion i zbudować ją za pomocą Mavena. Zależy to od biblioteki globalmentor-core, którą można również zbudować i zainstalować za pomocą Maven.


To zbyt skomplikowane, aby po prostu odtworzyć dźwięk. Możesz po prostu to zrobić: stackoverflow.com/a/9622040/1417267
slinden77


1

Myślę, że koncepcja „dźwięku powiadomienia” jest w jakiś sposób błędna dla interfejsu użytkownika Androida.

Oczekiwane zachowanie systemu Android polega na użyciu standardowego powiadomienia w celu ostrzeżenia użytkownika. Jeśli odtwarzasz dźwięk powiadomienia bez ikony na pasku stanu, możesz zdezorientować użytkownika („co to był za dźwięk? Nie ma tutaj ikony, może mam problemy ze słuchem?”).

Jak ustawić dźwięk w powiadomieniu, na przykład tutaj: Ustawianie dźwięku dla powiadomienia


1
Niezupełnie, może to być powiadomienie w aplikacji. Na przykład, jeśli jesteś w aplikacji do czatu i masz niewielkie efekty dźwiękowe dla wiadomości przychodzących i wychodzących. Są to w istocie powiadomienia i chcesz, aby się zamykały, gdy telefon jest w trybie cichym.
copolii

Cóż, masz rację, ale to inna sprawa. Mówiłem (zakładając, że to był temat pytania) o „dźwiękach powiadomień systemowych”, czyli o systemie Android GUI. Oczywiście, gdy wchodzisz w swoją własną aplikację, wszystko zależy od Ciebie.
think01

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
Dziękujemy za ten fragment kodu, który może zapewnić ograniczoną, natychmiastową pomoc. Właściwe wyjaśnienie byłoby znacznie poprawić swoją długoterminową wartość pokazując dlaczego jest to dobre rozwiązanie problemu i byłoby bardziej użyteczne dla czytelników przyszłości z innymi, podobnymi pytaniami. Proszę edytować swoją odpowiedź dodać kilka wyjaśnień, w tym założeń już wykonanych.
NIE,

0

Ustaw dźwięk na kanał powiadomień

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

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

        channel.setSound(alarmUri, attributes);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.