So spielen Sie einen Android-Benachrichtigungston ab

168

Ich habe mich gefragt, wie ich einen Benachrichtigungston abspielen kann, ohne ihn über den Medienstrom abzuspielen. Im Moment kann ich dies über den Media Player tun, ich möchte jedoch nicht, dass es als Mediendatei abgespielt wird, sondern als Benachrichtigung, Warnung oder Klingelton. Hier ist ein Beispiel dafür, wie mein Code gerade aussieht:

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

Antworten:

420

Wenn noch jemand nach einer Lösung dafür sucht, habe ich unter Wie man Klingelton / Alarmton in Android wiedergibt , eine Antwort gefunden

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

Sie können TYPE_NOTIFICATION in TYPE_ALARM ändern, aber Sie möchten Ihren Klingelton r im Auge behalten, um die Wiedergabe zu beenden ... sagen wir, wenn der Benutzer auf eine Schaltfläche oder etwas klickt.

Phidius
quelle
2
Motorola-Telefone haben beispielsweise die Einstellungen erweitert und ermöglichen es dem Benutzer, einen Benachrichtigungston für SMS und andere Kategorien zu definieren. Die obige Methode funktioniert mit diesem Telefontyp nicht. Haben Sie eine Idee, wie Sie dieses Problem lösen können?
David
2
Ich habe einen Fehler dabei : MediaPlayer - Should have subtitle controller already set. Was heißt das?
Deqing
Bei Verwendung dieser Lösung werden die Sounds nach 28/29 Mal nicht mehr abgespielt. Weiß jemand warum?
Tom Brinkkemper
1
Warum fangen Sie jede Ausnahme? Welches darf geworfen werden?
Miha_x64
2
@ Sam, ja. stackoverflow.com/q/39876885/2614353.Erstellen Sie grundsätzlich nicht jedes Mal ein RingTone-Objekt, wenn Sie es abspielen. Erstellen Sie es einmal und spielen Sie dann dasselbe Objekt mehrmals ab.
Tom Brinkkemper
205

Sie können dies jetzt tun, indem Sie den Sound beim Erstellen einer Benachrichtigung einbeziehen, anstatt den Sound separat aufzurufen.

//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());
Rob Riddle
quelle
12
Dies löst ein anderes Problem - nicht "wie ein Benachrichtigungston abgespielt wird", sondern "wie eine Benachrichtigung abgespielt und ein Ton angezeigt wird". Die akzeptierte Antwort ist in ihrer Lösung gerechtfertigt.
Fabian Tamp
7
Vielleicht sollten Sie dies auch so einstellen, dass es über STREAM_NOTIFICATION abgespielt wird, damit es mit der aktuellen Benachrichtigungslautstärke des Betriebssystems abgespielt wird: .setSound (soundUri, AudioManager.STREAM_NOTIFICATION)
mwk
@ Rob Riddle Es funktioniert gut. Bei mehreren Benachrichtigungen, z. B. 100 Benachrichtigungen parallel, wird der Ton mit dem nächsten Benachrichtigungston gemischt. Wenn bereits ein Ton abgespielt wird, sollte er logischerweise auf den Abschluss des vorherigen Spiels warten. Können Sie bitte in diesem Szenario helfen?
Waqas Ali Razzaq
Der Sound wird nicht abgespielt, wenn sich die App im Hintergrund befindet. irgendein Vorschlag?
Sagar Nayak
47

Wenn Sie möchten, dass ein Standardbenachrichtigungston abgespielt wird, können Sie die Klassenmethode setDefaults (int) verwenden 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);

Ich glaube, das ist der einfachste Weg, um Ihre Aufgabe zu erfüllen.

aga
quelle
Der Sound wird nicht abgespielt, wenn sich die App im Hintergrund befindet. irgendein Vorschlag?
Sagar Nayak
13

Versuche dies:

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

Es ist eine Weile her seit Ihrer Frage, aber ... Haben Sie versucht, den Audio-Stream-Typ einzustellen?

mp.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);

Dies muss vor der Vorbereitung erfolgen.

copolii
quelle
2

Ich hatte so ziemlich die gleiche Frage. Nach einigen Recherchen denke ich, dass Sie, wenn Sie den "Benachrichtigungston" des Standardsystems abspielen möchten, so ziemlich eine Benachrichtigung anzeigen und anweisen müssen, den Standardton zu verwenden. Und es gibt etwas zu sagen für das Argument in einigen der anderen Antworten, dass Sie, wenn Sie einen Benachrichtigungston abspielen, auch eine Benachrichtigungsnachricht präsentieren sollten.

Wenn Sie jedoch die Benachrichtigungs-API ein wenig anpassen, können Sie sich dem nähern, was Sie möchten. Sie können eine leere Benachrichtigung anzeigen und diese nach einigen Sekunden automatisch entfernen. Ich denke, das wird für mich funktionieren. Vielleicht funktioniert es für Sie.

Ich habe eine Reihe von praktischen Methoden erstellt, mit com.globalmentor.android.app.Notifications.javadenen Sie einen Benachrichtigungston wie folgt erstellen können:

Notifications.notify(this);

Die LED blinkt ebenfalls und wenn Sie die Berechtigung zum Vibrieren haben, tritt eine Vibration auf. Ja, ein Benachrichtigungssymbol wird in der Benachrichtigungsleiste angezeigt, verschwindet jedoch nach einigen Sekunden.

An diesem Punkt stellen Sie möglicherweise fest, dass die Benachrichtigung in der Benachrichtigungsleiste angezeigt werden kann, da die Benachrichtigung ohnehin nicht mehr angezeigt wird. Sie können das so machen:

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

Es gibt viele andere bequeme Methoden in dieser Klasse. Sie können die gesamte Bibliothek aus dem Subversion-Repository herunterladen und mit Maven erstellen. Dies hängt von der Globalmentor-Core-Bibliothek ab, die auch mit Maven erstellt und installiert werden kann.

Garret Wilson
quelle
Das ist viel zu kompliziert, um einfach einen Sound abzuspielen. Sie können dies einfach tun: stackoverflow.com/a/9622040/1417267
slinden77
1

Sie können Notification und NotificationManager verwenden , um die gewünschte Benachrichtigung anzuzeigen. Sie können dann den Sound, den Sie mit Ihrer Benachrichtigung abspielen möchten, anpassen.

Valentin Rocher
quelle
5
Ich möchte keine Benachrichtigung anzeigen, sondern nur den Sound abspielen.
Ninjasense
1

Ich denke, das Konzept des "Benachrichtigungstons" ist für die Android-Benutzeroberfläche irgendwie falsch.

Das von Android erwartete Verhalten besteht darin, die Standardbenachrichtigung zu verwenden, um den Benutzer zu benachrichtigen. Wenn Sie einen Benachrichtigungston ohne das Statusleistensymbol abspielen, wird der Benutzer verwirrt ("Was war das für ein Ton? Hier gibt es kein Symbol, möglicherweise habe ich Hörprobleme?").

So stellen Sie beispielsweise den Ton für eine Benachrichtigung ein: Einstellen des Tons für die Benachrichtigung

think01
quelle
1
Nicht wirklich, dies kann eine In-App-Benachrichtigung sein. Zum Beispiel, wenn Sie sich in einer Chat-App befinden und kleine Soundeffekte für eingehende und ausgehende Nachrichten haben. Dies sind im Wesentlichen Benachrichtigungen, und Sie möchten, dass sie geschlossen werden, wenn sich das Telefon im lautlosen Modus befindet.
Copolii
Du hast recht, aber das ist eine andere Sache. Ich habe (vorausgesetzt, dies war das Thema der Frage) von "Systembenachrichtigungstönen" gesprochen, das heißt auf der Android-GUI des Systems. Natürlich, wenn Sie in Ihrer eigenen App sind, wie es ganz bei Ihnen liegt.
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());
    }
}
dsc clg
quelle
1
Vielen Dank für dieses Code-Snippet, das möglicherweise nur begrenzte und sofortige Hilfe bietet. Eine richtige Erklärung würde ihren langfristigen Wert erheblich verbessern, indem sie zeigt, warum dies eine gute Lösung für das Problem ist, und es für zukünftige Leser mit anderen, ähnlichen Fragen nützlicher machen. Bitte bearbeiten Sie Ihre Antwort, um eine Erklärung hinzuzufügen, einschließlich der von Ihnen getroffenen Annahmen.
NOhs
0

Stellen Sie den Ton auf den Benachrichtigungskanal ein

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

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

        channel.setSound(alarmUri, attributes);
Milind Chaudhary
quelle