Signal- oder Benachrichtigungston ausgeben

  • Antworten:9
  • OffenNicht stickyBentwortet
  • Forum-Beiträge: 34

10.10.2017, 23:17:48 via Website

Hallo zusammen

Ich suche nach einer Lösung zu einem vermutlich kleinen Problem:
In meiner App sind 16 Switch programmiert. Wozu diese dienen ist nebensächlich.
Wichtig ist, dass sich die Switches wenn 'true' über eine Abfrage automatisch auf 'false' stellen.
Das ist soweit ok und macht, was es soll.
Ich möchte nun die Switches soweit verändern, dass sie beim Umstellen auf 'false' einen Ton ausgeben.
Bei meiner Suche im Internet habe ich nur eine Lösung gefunden, die grundsätzlich das richtige tun würde, aber unerwünschte Nebenwirkungen erzeugt.
Darum wende ich mich an euch mit der Frage:
Wie kann ich Android dazu bringen, bei einem definierten Ereignis einen Benachrichtigungston auszugeben?

Jegliche Gedankenanstösse sind willkommen. :)

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.182

11.10.2017, 19:46:05 via App

Nur den Ton könntest du über die MediaPlayer Klasse realisieren.
Ansonsten müsstest du eine Notification erstellen und ggf. nach einer Sekunde wieder canceln.
Das würde dann wie ein Benachrichtigungston ohne Benachrichtigung sein.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
  • Forum-Beiträge: 34

12.10.2017, 10:55:21 via App

Ich schau mir mal die Mediaplayer Klasse genauer an. Das mit dem ToneGenerator war die Lösung aus dem Internet mit den unerwünschten Nebenwirkungen. :) Diese Variante habe ich wieder verworfen.

Danke schon mal Für den Input.

Antworten
  • Forum-Beiträge: 2.909

12.10.2017, 11:29:37 via Website

Hallo Urs,

ich hatte mal etwas Ähnliches zu realisieren ..
UI und ein Vorhaben dieser Art kommen sich leider in die Quere

Um den Tongenerator hierzu richtig anzuwenden , müsstest du für deine Anwendung das Ganze in einem SingleTon
erstellen , deine PCM Wave bei der Initialisierung erstellen und dann nur noch diese bei Bedarf abspielen .

Wenn du das nicht machst , benötigt die Erstellung zu viel Zeit und du hast einen Zeitlichen-Versatz,
resp. einen kleinen Freeze.

Wenn du den Mediaplayer benutzt , solltest du den auf alle Fälle asynchron aufsetzen, sonst
hast du das Gleiche wie oben 1:1

Am Besten ist es eh, das Abspielen des Sounds in einem gesonderten Thread einzubetten.

— geändert am 12.10.2017, 12:07:31

Liebe Grüße - Stefan
[ App - Entwicklung ]

Pascal P.

Antworten
  • Forum-Beiträge: 34

14.10.2017, 21:16:30 via Website

Irgendwie will das nicht.

Sobald ich den MediaPlayer in meine App einfüge, stürzt sie ab.

MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.tone)

(tone ist eine AudioDatei von 2 Sekunden länge: tone.ogg)
Diese Zeile verursacht gemäss Debugger einen ExceptionError und die App bricht ab.

Debugger Msg: E/AndroidRuntime: FATAL EXCEPTION: main

Was mach ich falsch?

— geändert am 14.10.2017, 21:18:22

Antworten
  • Forum-Beiträge: 2.909

14.10.2017, 22:00:45 via Website

Hallo Urs,

MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.tone)

Ich weis ja nicht, woher ihr die diversen Beispiele "klaut" :'(
Manchmal echt grausam.

Die Initalisierung des Mediaplayers sollte schon "ordentlich" gemacht werden.
(Prepare, Start, Callback)

Schau mal bitte in der orginalen API , dort ist das schön dargestellt.
https://developer.android.com/reference/android/media/MediaPlayer.html#StateDiagram

Oben habe ich Dir angeraten, für dein Vorhaben auf alle Fälle AsynChron zu arbeiten.
Das erreichst du allerdings auch nicht mit deinem Beispiel
https://developer.android.com/reference/android/media/AsyncPlayer.html

Plays a series of audio URIs, but does all the hard work on another thread so that any slowness with preparing or loading doesn't block the calling thread.

Und wie bereits erwähnt - einfacher wäre es mit dem Tongenerator im Thread/Singleton gewesen

— geändert am 14.10.2017, 22:30:47

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
  • Forum-Beiträge: 34

15.10.2017, 11:44:19 via Website

Zum 'StateDiagram':
Was da dargestellt wird entspricht auf mein Anliegen umgerechnet etwa einen Kleinlaster zu benutzen, um eine Schaufel Sand einen Meter weit zu bewegen.
Ich brauche das ganze Start/Stop/Pause- und SoundBibliothek-Paket nicht. Ich will lediglich eine einzige vorhandene Audiodatei von 2 Sekunden länge bei einem bestimmten Ereignis aus dem Verzeichnis 'raw' automatisch abspielen lassen. Das ist das Ereignis:

    if (setToPro > playerPro || Objects.equals(sg1t, "0.000")) {
        switchText1.setTextColor(0xFFFF0000);
        switchText1.setChecked(false);
    }

und so soll es aussehen:

    if (setToPro > playerPro || Objects.equals(sg1t, "0.000")) {
        switchText1.setTextColor(0xFFFF0000);
        switchText1.setChecked(false);
        mediaPlayer.start();
    }

Diese Abfrage gibt es 16x.

Dass ich dafür im Internet nach der einfachsten Lösung suche, dürfte verständlich sein. Leider ist es so, dass zum Thema Signalton sehr wenig zu finden ist. Ich möchte mich mit diesem Thema auch nicht wirklich gross auseinandersetzen müssen. Tonerzeugung und Audioplayer sind keine Themen, die mich gross interessieren. Das was ich machen will sind Tools, die für mich nützlich sind. Ich setze mich darum auch mit dem playStore nicht auseinander, da ich meine Tools (bis jetzt) nicht mit der Absicht erstelle, diese anzubieten.

Darum, Stefan, wenn du mir ein Snippet anbieten kannst, das ich ohne grosse Umstände in mein Projekt einfügen kann, wäre ich schon glücklich. Oder vielleicht hast du irgendwo einen Link zu einer fertigen Lösung, die mein Bedürfnis befriedigt.

Noch eine Bemerkung am Rande: Ich habe nie Englisch gelernt. Die meisten Texte, die irgendwelche Erklärungen beschreiben, kann ich nicht übersetzen. :)

Gruss Urs

Antworten
  • Forum-Beiträge: 34

16.10.2017, 09:46:21 via Website

Irgendwie komm ich hier nicht weiter.
Ich werde mir einen anderen Weg suchen müssen, um mein Ziel zu erreichen.

Antworten

Empfohlene Artikel