Come riprodurre un suono di notifica Android


169

Mi chiedevo come avrei potuto riprodurre un suono di notifica senza riprodurlo sul flusso multimediale. In questo momento posso farlo tramite il lettore multimediale, tuttavia non voglio che venga riprodotto come file multimediale, voglio che venga riprodotto come notifica o avviso o suoneria. ecco un esempio di come appare il mio codice in questo momento:

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

Risposte:


421

Se qualcuno è ancora alla ricerca di una soluzione a questo, ho trovato una risposta su Come riprodurre il suono della suoneria / sveglia in Android

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

Puoi cambiare TYPE_NOTIFICATION in TYPE_ALARM, ma ti consigliamo di tenere traccia della tua suoneria r per interrompere la riproduzione ... diciamo, quando l'utente fa clic su un pulsante o qualcosa del genere.


2
I telefoni Motorola, ad esempio, hanno esteso l'attività delle preferenze e consentono all'utente di definire un suono di notifica per gli sms e altre categorie. Il metodo sopra non funziona con questo tipo di telefoni. Hai idea di come risolvere questo problema?
David,

2
Ho ottenuto un errore con questo: MediaPlayer - Should have subtitle controller already set. Cosa significa?
Deqing,

Usando questa soluzione, dopo 28/29 volte, il suono smette di suonare. Qualcuno sa perché?
Tom Brinkkemper,

1
Perché cogli ogni eccezione? Quale può essere lanciato?
Miha_x64,

2
@Sam, Sì. stackoverflow.com/q/39876885/2614353 . In sostanza , non creare un oggetto RingTone ogni volta che lo suoni. Crearlo una volta, quindi riprodurre più volte lo stesso oggetto.
Tom Brinkkemper,

205

Ora puoi farlo includendo il suono quando crei una notifica piuttosto che chiamarlo separatamente.

//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
Ciò risolve un problema diverso: non "come riprodurre un suono di notifica", ma "come riprodurre una notifica e visualizzare un suono". La risposta accettata è giustificata nella sua soluzione.
Fabian Tamp

7
Forse dovresti anche impostare questo per riprodurre tramite STREAM_NOTIFICATION in modo che venga riprodotto con la preferenza del volume di notifica corrente del sistema operativo: .setSound (soundUri, AudioManager.STREAM_NOTIFICATION)
mwk

@Rob Riddle Funziona bene. ma in caso di più notifiche, ad esempio 100 notifiche in parallelo, il suono viene mischiato al suono di notifica successivo. logicamente se il suono è già in riproduzione, dovrebbe attendere il completamento della riproduzione precedente. Potete per favore aiutare in questo scenario?
Waqas Ali Razzaq,

non riproduce il suono quando l'app è in background. qualche suggerimento?
Sagar Nayak,

47

Se si desidera riprodurre un suono di notifica predefinito, è possibile utilizzare il metodo di classe 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);

Credo che sia il modo più semplice per svolgere il tuo compito.


non riproduce il suono quando l'app è in background. qualche suggerimento?
Sagar Nayak,

13

Prova questo:

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

È passato un po 'di tempo dalla tua domanda, ma ... Hai provato a impostare il tipo di flusso Audio?

mp.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);

Deve essere fatto prima di prepararsi.


2

Avevo praticamente la stessa domanda. Dopo alcune ricerche, penso che se si desidera riprodurre il "suono di notifica" del sistema predefinito, è necessario visualizzare una notifica e dirgli di utilizzare il suono predefinito. E c'è qualcosa da dire per l'argomento in alcune delle altre risposte che se stai riproducendo un suono di notifica, dovresti presentare anche un messaggio di notifica.

Tuttavia, un po 'di modifica dell'API di notifica e puoi avvicinarti a ciò che desideri. È possibile visualizzare una notifica vuota e quindi rimuoverla automaticamente dopo alcuni secondi. Penso che questo funzionerà per me; Forse funzionerà per te.

Ho creato una serie di metodi di praticità com.globalmentor.android.app.Notifications.javache ti consentono di creare un suono di notifica come questo:

Notifications.notify(this);

Anche il LED lampeggerà e, se si dispone dell'autorizzazione di vibrazione, si verificherà una vibrazione. Sì, un'icona di notifica apparirà nella barra delle notifiche ma scomparirà dopo alcuni secondi.

A questo punto potresti capire che, dato che la notifica andrà via comunque, potresti anche avere un messaggio ticker scorrevole nella barra delle notifiche; puoi farlo in questo modo:

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

Esistono molti altri metodi di praticità in questa classe. Puoi scaricare l'intera libreria dal suo repository Subversion e costruirla con Maven. Dipende dalla libreria globalmentor-core, che può anche essere costruita e installata con Maven.


È così complicato riprodurre semplicemente un suono. Si potrebbe semplicemente fare questo: stackoverflow.com/a/9622040/1417267
slinden77


1

Penso che il concetto di "suono di notifica" sia in qualche modo sbagliato per l'interfaccia utente di Android.

Il comportamento previsto da Android consiste nell'utilizzare la notifica standard per avvisare l'utente. Se si riproduce un suono di notifica senza l'icona della barra di stato, l'utente viene confuso ("che cos'è stato quel suono? Non c'è un'icona qui, forse ho problemi di udito?").

Come impostare l'audio su una notifica è, ad esempio, qui: Impostazione dell'audio per la notifica


1
Non proprio, questa potrebbe essere una notifica in-app. Ad esempio, se ti trovi in ​​un'app di chat e hai piccoli effetti sonori per i messaggi in entrata e in uscita. In sostanza, si tratta di notifiche e si desidera che vengano chiuse quando il telefono è in modalità silenziosa.
copolii

Bene, hai ragione, ma questa è un'altra cosa. Stavo parlando (supponendo che questo fosse l'argomento della domanda) di "suoni di notifica del sistema", cioè sulla GUI di Android del sistema. Certo, quando sei nella tua app, come tutto a te.
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
Grazie per questo frammento di codice, che potrebbe fornire un aiuto limitato e immediato. Una spiegazione adeguata migliorerebbe notevolmente il suo valore a lungo termine mostrando perché questa è una buona soluzione al problema e la renderebbe più utile ai futuri lettori con altre domande simili. Si prega di modificare la risposta di aggiungere qualche spiegazione, tra le ipotesi che hai fatto.
NOh,

0

Imposta l'audio sul canale di notifica

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

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

        channel.setSound(alarmUri, attributes);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.