Sound abspielen nach bestimmter Dauer

  • Antworten:9
philip24134
  • Forum-Beiträge: 9

21.11.2013, 11:36:19 via Website

Hallo, ich habe mich ein paar Monate lang selbst in Java eingearbeitet und habe es auch bereits geschafft, eine kleine App zu programmieren.

Ich habe jetzt ein neues Projekt, bei welchem ich aber nicht weiter komme.

Ich möchte die Systemzeit auslesen zum Zeitpunkt, wenn die App gestartet wird (das klappt problemlos). Diese Long-Variable nenne ich "timestarted".
Anschließend werden 5 Variablen vom Typ Long erstellt. Die Variablen sind
Long erste = timestarted + 60000
Long zweite = erste + 40000
Long dritte = zweite + 70000
Long vierte = dritte + 120000
Long fünfte = vierte + 200000

Die Variablen erste bis fünfte sind jeweils Zeitpunkte, wie unschwer zu erkennen ist. (Zeitpunkt erste = 60 Sek nach App-Start; Zeitpunkt zweite = 40 Sek nach Zeitpunkt erste bzw. 100 Sek nach App-Start; ... )

Diese Variablen sind nur bei der Programmierung einzustellen. Der Benutzer soll diese Variablen nicht verändern können.

Ich möchte nun zu jedem Zeitpunkt einen Sound abspielen.
Also in etwa nach dem Motto:

1if(timestarted == erste){
2MediaPlayer mp = MediaPlayer.create(getApplicationContext(),R.raw.erstersound);
3mp.start();
4}
5if(timestarted == zweite){
6MediaPlayer mp = MediaPlayer.create(getApplicationContext(),R.raw.zweitersound);
7mp.start();
8}
9...usw...

Ich habe es bereits geschafft einen Sound per Button-Klick abzuspielen. Aber bei diesem Problemchen komme ich einfach nicht weiter.
Ich hätte gern den kompletten Programmiercode für diesen Befehl.

Außerdem wichtig: Die App soll nicht einfrieren, während die Systemzeit überwacht wird. Es soll nämlich paralell dazu möglich bleiben, dass Methoden per Button-Klick ausgeführt werden können.

Antworten
Carsten M.
  • Forum-Beiträge: 33.204

21.11.2013, 11:46:26 via Website

Hi,

was ist denn genau das Problem?

Du schreibst, was Du willst. Aber nicht, was das Problem ist.

Herzliche Grüße

Carsten

Ich komm' mir langsam vor wie jemand, der ich bin // #cäthe

Antworten
Barbaric Chicken
  • Forum-Beiträge: 66

21.11.2013, 11:49:47 via Website

Hallo,

Timer Klasse vielleicht?
developer.android.com/reference/java/util/Timer.html

Sähe dann wohl in etwas so aus:

1Timer timer = new Timer();
2timer.schedule(new TimerTask()
3 {
4
5 @Override
6 public void run()
7 {
8 //Hier, was ausgeführt werden soll wenn der Timer ausgelöst wurde
9 MediaPlayer mp = MediaPlayer.create(getApplicationContext(),R.raw.zweitersound);
10 mp.start();
11 }
12 }, ZeitVerzögerung (Für erste also 60000));

Doofe ist halt das du für jede Verzögerung einen Timer erzeugen müsstest. Bzw in deinem Fall kannst du den Timer ja auch einfach neu setzen. Musst eben nur herausfinden an der Stelle, welche Zeit vergangen ist.

Viele Grüße

Antworten
philip24134
  • Forum-Beiträge: 9

21.11.2013, 12:09:26 via Website

@Carsten Müller
Ja richtig, das hätte ich noch reinschreiben können^^ ich würde gern wissen wie ich es zum laufen kriege. Ich hatte dazu keinerlei Ansätze, wie so etwas geht.

@BarbarickChicken
muss ich den Code dann in die onCreate-Methode der entsprechenden Klasse einsetzen oder irgendwo anders?
Danke :)

Antworten
Michele
  • Forum-Beiträge: 1.525

21.11.2013, 12:26:16 via Website

philip24134

muss ich den Code dann in die onCreate-Methode der entsprechenden Klasse einsetzen oder irgendwo anders?
Danke :)

Erst testen, dann fragen :D
Denn dir wurde sogar schon ein ganzer Code gepostet.


LG

— geändert am 21.11.2013, 12:37:19

Antworten
philip24134
  • Forum-Beiträge: 9

21.11.2013, 12:49:24 via Website

Jetzt habe ich es einfach in die onCreate gepackt und freue mich riesig darüber dass es funktioniert. Danke :)

Jetzt würde ich gern noch eine Kleinigkeit wissen:
Wie kann ich denn eine Aktion ständig wiederholend im selben Zeitabstand starten lassen?

Antworten
philip24134
  • Forum-Beiträge: 9

21.11.2013, 13:02:46 via Website

Alles klar, funktioniert auch super.
Vielen dank für deine Mühe und vor allem für die schnelle Antwort

Antworten
philip24134
  • Forum-Beiträge: 9

22.11.2013, 14:15:00 via Website

Ich habe jetzt versucht per TimerTask ein TextView zu aktualisieren. Das TextView soll alle 20 Sekunden aktualisiert werden.
Dass man per TimerTask nicht so einfach ein TextView aktualieren kann habe ich leider schon herausgefunden (Fehlermeldung: "Only the original thread that created a view hierarchy can touch its views.")

Bei Stackoverflow habe ich folgenden Programmiercode gefunden, den ich bereits leicht an meine erfordernisse angepasst habe:

1final TextView txtResult = (TextView)findViewById(R.id.tvtime);
2
3 t.scheduleAtFixedRate(new TimerTask()
4 {
5
6 @Override
7 public void run(){
8 Handler handler=new Handler();
9 Runnable r;
10 handler.post(r);
11 r=new Runnable(){
12 public void run() {
13 txtResult.append(timeString);
14 }
15 };
16 handler.postDelayed(r, 1000);
17 }
18 }, 500, 20 * 1000);
19 }

in Zeile 8 wird "Handler" rot unterstrichen und es erscheint die Fehlermeldung "Cannot instantiate the type Handler". Per Google-Suche wurde ich leider nicht fündig was eine Lösung angeht.

Weiß vielleicht jemand von euch, was es damit auf sich hat? Oder gibt es eine andere und einfachere Methode, um den Inhalt eines TextViews per TimerTask zu aktualisieren?

— geändert am 22.11.2013, 14:23:05

Antworten
impjor
  • Forum-Beiträge: 1.793

22.11.2013, 15:12:52 via Website

Dein Codeschnipsel ist leider völlig falsch und ich glaube nicht, dass du ihn so bei stackoverflow gefunden hast.

Das ist auch das erste Problem: Wenn man nur Copy&Paste macht, kommt man nicht weit.

Für dein Problem sollte es am einfachsten sein, die Funktion Activity#runOnUiThread() zu benutzen. Also z.B.
1MainActivity.this.runOnUiThread(new Runnable() {...});

========

Zu deinem Code:
1. Der Handler muss in dem richtigen Thread erstellt werden. Also z.B. in der onCreate.
2. handler.post(r); postet dein leeres Runnable, welches du erst später erstellst. (new Runnable())


LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten