Brauche hilfe beim Soundpool.

  • Antworten:15
Nico
  • Forum-Beiträge: 8

20.12.2012, 22:04:19 via Website

Hallo liebe Community, ich bin hier ganz neu im Forum und auch wie auch in der Android Developing welt.
Ich würde ganz gerne ein Soundboard erstellen und habe dies auch schon geschafft. Nun ist mir eben aufgefallen, dass der MediaPlayer nicht für kurze sounds gedacht ist (MIST!). es sieh so aus, als wäre dieser um einiges komplizierter als der Media Player. Wäre schon wenn mir jemand kurz erklären könnte wie die .jar ausszusehen hat und was ich in meinem jetzigen Code ändern muss.


Danke




package de.walter.soundboard;

import java.io.IOException;

import android.media.MediaPlayer;

import android.media.MediaPlayer;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;

public class MainActivity extends Activity {

private static final String[] urls = null;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}

public void DOH (View view){

MediaPlayer mpSplash = MediaPlayer.create(this, R.raw.doh);
mpSplash.start();

}

public void fresse (View view){

MediaPlayer mpSplash = MediaPlayer.create(this, R.raw.fresse);
mpSplash.start();

}

public void didi (View view){
MediaPlayer mpSplash = MediaPlayer.create(this,R.raw.didi);
mpSplash.start();
}

public void shutup (View view){
MediaPlayer mpSplash = MediaPlayer.create(this,R.raw.shutup);
mpSplash.start();
}

— geändert am 20.12.2012, 22:04:47

Antworten
Jan H.
  • Forum-Beiträge: 16

24.12.2012, 02:25:13 via Website

Erstmal Willkommen im Forum!

Den "Media Player" benutze ich auch für meine Soundboard App.

Hast du überhaupt schon die Buttons die jeweilige ID gegeben?

Ich finde in Foren sind solche Sachen immer doof zu erklären, am besten du hast TeamSpeak, Sykpe, ... denn könnte ICH es dir erklären.

Antworten
Nico
  • Forum-Beiträge: 8

24.12.2012, 15:37:09 via Website

Super danke für deine Hilfe aber ich denk es ist besser wenn wir das hier klären, dann könen die Leute, die dassselbe Problem haben auch lösen.
Zu der App, sie ist sogar schon im Store

play.google.com/store/apps/details?id=de.walter.soundboard&feature=search_result#?t=W251bGwsMSwyLDEsImRlLndhbHRlci5zb3VuZGJvYXJkIl0.

Problem ist nur, da ich das jetzt alles mit dem MediaPlayer durchgezogen hab, dass nach öfterem drücken der sounds aus bleibt und nur ein neustart der app etwas bringt. Zu dem Problem habe ich mal etwas von ressourcen freimachen gelesen aber ich versteh nicht ganz wie das geht, wäre toll wenn du kurz erklären könntest.

danke

Antworten
Nico
  • Forum-Beiträge: 8

24.12.2012, 15:39:39 via Website

Jan H.



Hast du überhaupt schon die Buttons die jeweilige ID gegeben?


Ja natürlich ;)

Antworten
Jan H.
  • Forum-Beiträge: 16

24.12.2012, 19:23:09 via Website

Schau mal hier vorbei => www.AndroidSoundboard.org

Dort kannst du dir eine Vorlage runterladen.

Nico

Antworten
Nico
  • Forum-Beiträge: 8

24.12.2012, 23:18:05 via Website

Danke für den link aber dann müsste ich alles umschreiben. das einzige Problem was ich im Moment habe ist das nach ein paar Klicks kein Sound mehr abgespielt wird. Ich habe schon alle möglichen Beiträge und eintrage durchgelesen aber leider funktionieren die Möglichkeiten

MpSplash.release() oder MpSplash.reset()
Nicht... Was hab ich falsch gemacht, fehlt irgendetwas?

Beispiel

public void didi (View view)
{ MediaPlayer mpSplash = MediaPlayer.create(this,R.raw.didi);
mpSplash.start();
MpSplash.reset () Nicht öder MpSplash.release()}

— geändert am 24.12.2012, 23:20:39

Antworten
Jan H.
  • Forum-Beiträge: 16

25.12.2012, 00:53:40 via Website

Was du haben möchtest ist eine Start-Stop-Reset Funktion.

Sowas brauche ich auch :-) Aber leider kann ich es nicht bzw. ich weiß nicht wie man dies schreibt.

Hier der Link zu meinen Thread:
https://www.nextpit.de/de/android/forum/thread/500921/Soundboard-Sound-Start-Stop-Reset

PS: Wie hast du das hin bekommen das sich beim ScrollView die Überschrift nicht mit bewegt?

Antworten
Nico
  • Forum-Beiträge: 8

25.12.2012, 00:57:54 via Website

Jan H.


PS: Wie hast du das hin bekommen das sich beim ScrollView die Überschrift nicht mit bewegt?

Meinst du den Text : zum abspielen Bitte anklicken? Einfach einen Text eingefügt und die obere Seite "festgeklebt" ;). Also separat vom ScrollView einen TextView

Antworten
Andreas Weichert
  • Forum-Beiträge: 287

26.12.2012, 21:35:52 via Website

Also das Hauptproblem scheint zu sein, dass Du inm jeden ButtonClick einen neuen Mediaplayer erzeugst.
Ist erstens umständlich und verbraucht auch jedesmal Speicher.
Warum nimmst Du nicht immer denselben Mediaplayer. Dann hast Du außerdem nicht das Problem das der letzte Sound noch weiterspielt,
wenn Du einen anderen Button drückst.

Antworten
Nico
  • Forum-Beiträge: 8

27.12.2012, 01:57:56 via Website

Tja warum ich das mache? Das is ne schöne Frage ;) ganz einfach weil ich es nicht anders kann :D aber wenn du mir zeigst wie das geht, wären alle meine Probleme gelöst.

Danke im Vorraus

Antworten
Phil G.
  • Forum-Beiträge: 86

27.12.2012, 09:51:46 via Website

Jan scheint ja ein ähnliches Problem zu haben und da habe ich gedanklich mal die Vorgehensweise skizziert.

https://www.nextpit.de/de/android/forum/thread/500921/Soundboard-Sound-Start-Stop-Reset

---------------
Problem1 : mehre Mediaplayer instanzen, also erschaffen wir uns nur einen Mediaplayer und setzen nur das Soundfile neu
Das deklariere ich direkt in meiner Klasse (in deinem Fall MainActivity)

1private MediaPlayer mediaPlayer;
2 private int[] soundliste = {R.raw.toco1, R.raw.toco2, R.raw.toco3};
3
4 private Button but1;
5 private Button but2;

im oncreate erzeugen wir dann ein wenig

1mediaPlayer = new MediaPlayer();

Das Problem der 1000 OnClickhandler hatte ich bereits in Jan seinem Thread angesprochen, das macht den Code schnell unleserlich und schafft Raum für Fehler.

Vorschlag: wir geben der Activty gleich einen Clickhandler mit und "überladen" diese Methode

1public class MainActivity extends Activity implements OnClickListener {

und fügen eine für alles gültige onCLick Methode ein.

1public void onClick(View v) {
2 }

Was jetzt noch fehlt sind die Buttons - der EInfachheit halber habe ich sie einmal nur but1,but2 genannt,
diese sammeln wir uns im onCreate zusammen

1but1 = (Button) findViewById(R.id.button1);
2 but1.setOnClickListener(this);
3
4 but2 = (Button) findViewById(R.id.button2);
5 but2.setOnClickListener(this);

was jetzt noch fehlt ist unsere Abspielroutine und unser Clickhandler.
Der Cllckhandler wird ganz einfach, ich unterscheide die Button und rufe dann meine Soundabspielroutine auf, die ganzen Soundfiles habe ich mir in einem Array zusammen gefasst, somit ist es übersichtlicher und ich kann schneller Sounds austauschen/hinzufügen, was auch immer.

1@Override
2 public void onClick(View v) {
3
4 switch(v.getId()){
5
6 case R.id.button1:
7 spiele_sound(soundliste[0]);
8 break;
9 case R.id.button2:
10 spiele_sound(soundliste[1]);
11 break;
12 }
13 }

Ok und nun die Abspielroutine:
Kleine Warnung im Vorfeld: der Mediaplayer ist viel mächtiger und kann per Listener ect auf Events reagieren, diese habe ich hier nicht eingebaut, sollte aber für die Zukunft eine Option sein. Beispiel - Soundfile ist zu Ende gespielt MediaPlayer.OnCompletionListener.

Ok die Abspielroutine ist sehr einfach gehalten:

-> Index des Soundfiles (aus unserem Array wird übergeben) -> siehe oben
-> es wird geprüft ob der MediaPlayer bereits spielt und bei bedarf gestoppt
-> das neue gewünschte Soundfile wird dem Player zugewiesen und abgespielt

1private void spiele_sound(int resid) {
2
3 if (mediaPlayer.isPlaying()){
4 mediaPlayer.stop();
5 }
6
7 AssetFileDescriptor afd = getApplicationContext().getResources().openRawResourceFd(resid);
8
9 try
10 {
11 mediaPlayer.reset();
12 mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength());
13 mediaPlayer.prepare();
14 mediaPlayer.start();
15 afd.close();
16 }
17 catch (IllegalArgumentException e)
18 {
19 Log.e("KAN", "Unable to play audio queue do to exception: " + e.getMessage(), e);
20 }
21 catch (IllegalStateException e)
22 {
23 Log.e("KAN", "Unable to play audio queue do to exception: " + e.getMessage(), e);
24 }
25 catch (IOException e)
26 {
27 Log.e("KAN", "Unable to play audio queue do to exception: " + e.getMessage(), e);
28 }
29
30 }

Anmerkung:

das ist natürlich alles Quick-n-Dirty und für eine richtige App müssten noch ein paar Sachen rein

-> in das onPause der Actity --- > sollte der Mediaplayer gestoppt werden
-> in der Abspielroutine sollte man den MediaPlayer gg null testen ob er überhaupt noch da ist,
-> naja und so krimskrams halt

Antworten
Andreas Weichert
  • Forum-Beiträge: 287

27.12.2012, 10:27:36 via Website

Super besser hätte ich es auch nicht beschreiben können - so hatte ich mir das auch vorgestellt - hätte mir aber wohl nicht die Mühe gemacht das alles aufzuschreiben.
Noch einen Tip: (Als Programmierer ist man ja schreibfaul.)
Das Verbinden der Buttons mit den Resourcen und das setzen der OnClickListener kann man sich sparen, wenn man alle auf dieselbe OnClick funktion setzt (im Layoutdesigner).
Die elegante Lösung wäre allerdings die Buttons dynamisch zu erzeugen und die Referenzen in einem array zu speichern oder gleich einen Listview zu nehmen.

Antworten
Phil G.
  • Forum-Beiträge: 86

27.12.2012, 10:41:48 via Website


Das Verbinden der Buttons mit den Resourcen und das setzen der OnClickListener kann man sich sparen, wenn man alle auf dieselbe OnClick funktion setzt (im Layoutdesigner).

Sorry etwas Offtopic, aber ich dachte immer das ist schlechter Stil wenn man Design und Code vermischt?

Gerade bei Android wundert man sich dann woher der Funktionsaufruf stammt wenn man nicht weiss das man dies auch im XML Layout definieren kann... also gerade für Anfänger/Ungeübte dürfte das dann wie Hexerei wirken.

Deine Lösung 2 mit dem dynamischen Ansatz fände ich dann persöhnlich besser bzw. habe ich schon selber so genutzt um dynamische Layouts zu bauen und dort den Handler dran zu kleben.

Antworten
Andreas Weichert
  • Forum-Beiträge: 287

27.12.2012, 13:17:39 via Website

Wer bestimmt was ein guter Stil ist? Man macht die Entscheidung für sich selber!
Gerade für Anfänger ist es wohl einfacher übers Layout die Funktion zu setzen (die meißten IDEs z.B. Visual Studion funktionieren ja so) als über einen Listener. Inkonsequent ist bei Android nur das es keine entsprechenden Funtion für Longclick gibt.

Ich bin nur froh über jede Codezeile, die ich nicht unnötigerweise schreiben muß. Insbesonder die "Copy und Paste" Programmierung bei der dann Seitenweise fast identischer Code erzeugt wird empfinde ich als schlechten Stil. Da mach ich lieber was allgemeineres (ev. komplizierter) und kann das später auch noch woanders wiederverwenden.

Wollte aber jetzt keine philosophische Diskussion über Programmierstil anfangen. War einfach nur eine kurze Bemerkung von mir.

Antworten
Nico
  • Forum-Beiträge: 8

27.12.2012, 13:41:35 via Website

Ich merke gerade, dass das noch ein weiter weg zu dem verstandnis ist was ihr habt...gibt es evlt vlt bücher, in denen ich das lernen kann? Ich hatte bislang eins von uwe post aber ich muss sagen, das mir das garnicht gefällt.

Antworten
Andreas Weichert
  • Forum-Beiträge: 287

27.12.2012, 15:21:15 via Website

Glaube auch dass Dir unabhängig von Android und auch Java noch einige Grundlagen zu Programmierung fehlen. Aber gut dass Du Dich da ranwagst.

Hier hab ich einen Link der Uni-Oldenburg - zu Java und allg. Programmierung.

http://www-is.informatik.uni-oldenburg.de/~dibo/hamster/index2.html

Ich denke aber das ein gut aufgebautes Buch Dir noch besser hilft. Habe leider keines parat. Ich würde mich einfach mal 1-2 Stunden in eine Buchhadlung begeben und dort verschieden Java Bücher anlesen. Da findes Du schon etwas was Dir persönlich zusagt.

Phil G.Nico

Antworten