1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Soundboard Tutorial

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von elomanias, 19.12.2009.

  1. elomanias, 19.12.2009 #1
    elomanias

    elomanias Threadstarter Erfahrener Benutzer

    Beiträge:
    192
    Erhaltene Danke:
    15
    Registriert seit:
    02.12.2009
    Hi Leute
    ich will mit n paar freunden ein paar Soundboards erstellen, vorallem zu deutschen serien da fast alle ja englisch sind.

    Java erfahrung haben wir
    nur würde uns ein tutorial gewaltig helfen.

    ich hoffe jemand kann uns helfen

    mfg
    elomanias
     
  2. SeraphimSerapis, 19.12.2009 #2
    SeraphimSerapis

    SeraphimSerapis Android-Guru

    Beiträge:
    3,072
    Erhaltene Danke:
    1,138
    Registriert seit:
    27.02.2009
    Was genau wollt ihr denn da wissen?
    Habt ihr euch mal die Guides auf The Developer's Guide | Android Developers durchgelesen?

    Ihr fügt einfach einen Button hinzu (Layout und Java)
    Dann macht ihr für jeden Button folgendes in der onCreate(..)

    Button xy = (Button)findViewById(R.id.buttonXY);
    xy.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
    MediaPlayer mp = MediaPlayer.create(context, R.raw.sound_file_1);
    mp.start();
    }
    });

    Das wäre es dann. R.raw.sound_file_1 ist eine Mp3/Ogg/etc im res/raw-Verzeichnis

    Das hätte man aber mit der Dokumentation auch in Sekunden rausfinden können.
     
  3. elomanias, 03.01.2010 #3
    elomanias

    elomanias Threadstarter Erfahrener Benutzer

    Beiträge:
    192
    Erhaltene Danke:
    15
    Registriert seit:
    02.12.2009
    So hab jetzt nach den Feiertagen etwas an einem Soundboard gearbeitet

    hab day layout fertig, die java files fertig nur will der das nicht abspielen
    ich drücke auf einen der buttons und nichts passiert

    kann mir jemand helfen??

    meine java file mit dem OnCeate sieht so aus

    Code:
    package com.raddieltopo.soundboard.germanemployee;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.media.MediaPlayer;
    import android.os.Bundle;
    import android.view.View.OnClickListener;
    import android.view.MenuInflater;
    import android.view.View;
    import android.view.Menu;
    import android.view.MenuItem;
    
    public class GermanEmployee extends Activity implements OnClickListener {
       private MediaPlayer a,b,c,d,e,f,g,h,i,j,k,l; 
       
       @Override
       public void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.main);
           // Native rate is 44.1kHz 16 bit stereo, but
           // to save space we just use MPEG-3 22kHz mono
           a = MediaPlayer.create(this, R.raw.a);
           b = MediaPlayer.create(this, R.raw.b);
           c = MediaPlayer.create(this, R.raw.c);
           d = MediaPlayer.create(this, R.raw.d);
           e = MediaPlayer.create(this, R.raw.e);
           f = MediaPlayer.create(this, R.raw.f);
           g = MediaPlayer.create(this, R.raw.g);
           h = MediaPlayer.create(this, R.raw.h);
           i = MediaPlayer.create(this, R.raw.i);
           j = MediaPlayer.create(this, R.raw.j);
           k = MediaPlayer.create(this, R.raw.k);
           l = MediaPlayer.create(this, R.raw.l);
           
           // Setup click listeners
           setContentView(R.layout.main);
           
           View button0 = this.findViewById(R.id.button0);
           button0.setOnClickListener(this);
           View button1 = this.findViewById(R.id.button1);
           button1.setOnClickListener(this);
           View button2 = this.findViewById(R.id.button2);
           button2.setOnClickListener(this);
           View button3 = this.findViewById(R.id.button3);
           button3.setOnClickListener(this);
           View button4 = this.findViewById(R.id.button4);
           button4.setOnClickListener(this);
           View button5 = this.findViewById(R.id.button5);
           button5.setOnClickListener(this);
           View button6 = this.findViewById(R.id.button6);
           button6.setOnClickListener(this);
           View button7 = this.findViewById(R.id.button7);
           button7.setOnClickListener(this);
           View button8 = this.findViewById(R.id.button8);
           button8.setOnClickListener(this);
           View button9 = this.findViewById(R.id.button9);
           button9.setOnClickListener(this);
           View button10 = this.findViewById(R.id.button10);
           button10.setOnClickListener(this);
           View button11 = this.findViewById(R.id.button11);
           button11.setOnClickListener(this);
       }
     
       @Override
       public void onClick(View v) {
           MediaPlayer mp = null;
           switch (v.getId()) {
           
           case R.id.button0:
               mp=a;
               break;
           case R.id.button1:
               mp=b;
               break;
           case R.id.button2:
               mp=c;
               break;
           case R.id.button3:
               mp=d;
               break;
           case R.id.button4:
               mp=e;
               break;
           case R.id.button5:
               mp=f;
               break;
           case R.id.button6:
               mp=g;
               break;
           case R.id.button7:
               mp=h;
               break;
           case R.id.button8:
               mp=i;
               break;
           case R.id.button9:
               mp=j;
               break;
           case R.id.button10:
               mp=k;
               break;
           case R.id.button11:
               mp=l;
               break;           
           
           }
           
           mp.seekTo(0);
           mp.start();
           
       } 
       
        // Called only the first time the options menu is displayed.
        // Create the menu entries.
        // Menu adds items in the order shown.
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            super.onCreateOptionsMenu(menu);
            
            MenuInflater inflater = getMenuInflater();
            inflater.inflate(R.layout.menu, menu);
            
            // Parameters for menu.add are:
            // group -- Not used here.
            // id -- Used only when you want to handle and identify the click yourself.
            // title
            /*
            menu.add("About...");
            menu.add("Quit");
            */
            return true;
        }
        
        // Activity callback that lets your handle the selection in the class.
        // Return true to indicate that you've got it, false to indicate
        // that it should be handled by a declared handler object for that
        // item (handler objects are discouraged for reasons of efficiency).
        @Override
        public boolean onOptionsItemSelected(MenuItem item){
            
            switch(item.getItemId()) {
            
            case R.id.about:
                startActivity(new Intent(this, activity.class));
                return true;
            
            case R.id.quit:
                finish();
                return true;
               
            }
        
            return false;
        
        }
         
    }
    
     
    Zuletzt bearbeitet: 03.01.2010
  4. SeraphimSerapis, 03.01.2010 #4
    SeraphimSerapis

    SeraphimSerapis Android-Guru

    Beiträge:
    3,072
    Erhaltene Danke:
    1,138
    Registriert seit:
    27.02.2009
    Hast du dir mal die Mühe gemacht, und mit Toasts geschaut, ob die Listener funktionieren?
     
  5. elomanias, 03.01.2010 #5
    elomanias

    elomanias Threadstarter Erfahrener Benutzer

    Beiträge:
    192
    Erhaltene Danke:
    15
    Registriert seit:
    02.12.2009
    EDIT:

    so jetzt läufts :D

    nur leider spielt er direkt zu beginn den ersten Sound ab und sobald ich auf den 7. sound gehe stürzt das prog ab

    weis jemand rat ??

    mfg
    elomanias
     
    Zuletzt bearbeitet: 03.01.2010
  6. krümelmonster, 03.01.2010 #6
    krümelmonster

    krümelmonster Android-Hilfe.de Mitglied

    Beiträge:
    58
    Erhaltene Danke:
    1
    Registriert seit:
    03.01.2010
    ich hätte auch eine frage bezüglich des soundboards (insbesondere wegen sounds). in dem developer's guide, den SeraphimSerapis geschickt hat, steht, dass man den media player mittels stop() anhalten kann und mit reset() und prepare() wieder abspielbar machen. das stoppen funktioniert bei mir, jedoch nicht das wieder neu starten.
    hier ist der code:
    Code:
    final Button button01 = (Button) findViewById(R.id.Button01);
            button01.setOnClickListener(new OnClickListener() {
                boolean button01clicked = false;
                CharSequence button01txt = button01.getText();
                MediaPlayer mp01 = MediaPlayer.create(getBaseContext(), R.raw.sound01);
                public void onClick(View v) {
                    if(!button01clicked) {
                        mp01.start();
                        button01clicked = true;
                        button01.setText("-- Stop --");
                    } else {
                        mp01.stop();
                        mp01.reset();
                        try {
                            mp01.prepare();
                        } catch (IllegalStateException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        button01clicked = false;
                        button01.setText(button01txt);
                    }
                }
            });
    der button soll nach dem anklicken seinen text auf "-- stop --" ändern. alternativ wäre mir auch ein programm-globaler stop button sogar noch lieber, aber ich weiß noch nicht wie ich so einen machen kann.

    die zweite frage wäre, ob man die länge des sound ermitteln kann und nachdem er zu ende abgespielt ist eine aktion durchführen.

    wäre dankbar für eure antworten
     
    Zuletzt bearbeitet: 03.01.2010
  7. SeraphimSerapis, 04.01.2010 #7
    SeraphimSerapis

    SeraphimSerapis Android-Guru

    Beiträge:
    3,072
    Erhaltene Danke:
    1,138
    Registriert seit:
    27.02.2009
    ich würde an deiner stelle noch in der switch-case einen default einsetzen und .start() und .seekTo() in eine if mit (mp!=null) { .. }.
    das wäre, was mir zuerst dazu einfallen würde.

    hallo, du hast einen denkfehler in deinem code.
    ein globaler button ginge, indem man eben alle mp objekte stoppen lassen würde.

    text auf buttons ändern lassen gilt übrigens als schlechtes design. ich kann es von daher weniger empfehlen.
     
    Zuletzt bearbeitet: 04.01.2010
  8. elomanias, 04.01.2010 #8
    elomanias

    elomanias Threadstarter Erfahrener Benutzer

    Beiträge:
    192
    Erhaltene Danke:
    15
    Registriert seit:
    02.12.2009
    Hallo Seraph

    danke erstmal für deine Hilfe.
    hab leider grad voll die denkblokade

    kannste mir grad einfach n biepsiel in meinem code schreiben??

    mfg
    elomanias
     
  9. SeraphimSerapis, 04.01.2010 #9
    SeraphimSerapis

    SeraphimSerapis Android-Guru

    Beiträge:
    3,072
    Erhaltene Danke:
    1,138
    Registriert seit:
    27.02.2009
    Code:
    ...
    case R.id.button11:
               mp=l;
               break;           
    default:
               mp=null;
               break;
           }
           if(mp!=null) {
               mp.seekTo(0);
               mp.start();
           }       
       }
    ...
    
    so war das gedacht - aber keine garantie, dass es hilft.
    ansonsten vtl noch eine exception werfen lassen (zB per toast), was da genau bei deinem einen button schiefgeht.
     
    elomanias bedankt sich.
  10. krümelmonster, 04.01.2010 #10
    krümelmonster

    krümelmonster Android-Hilfe.de Mitglied

    Beiträge:
    58
    Erhaltene Danke:
    1
    Registriert seit:
    03.01.2010
    das problem jedoch ist, dass nach einem stop das neu starten des sounds nicht mehr funktioniert, trotz reset() und prepare()
     
  11. elomanias, 04.01.2010 #11
    elomanias

    elomanias Threadstarter Erfahrener Benutzer

    Beiträge:
    192
    Erhaltene Danke:
    15
    Registriert seit:
    02.12.2009
    Hi Seraph
    danke erstmal
    dank deines code snippets crasht das programm nicht mehr, doch will es die sound jetzt nicht abspielen
    wenigstens ein fortschritt.
    wobei ich grad auch nicht mehr weiter weiss
    wenn du willst kann ich dir die source per mail senden oder hier anhängen, sodass du sie dir genauer angucken kannst.

    mfg
    elomanias
     
  12. SeraphimSerapis, 04.01.2010 #12
    SeraphimSerapis

    SeraphimSerapis Android-Guru

    Beiträge:
    3,072
    Erhaltene Danke:
    1,138
    Registriert seit:
    27.02.2009
    du kannst mir mal dein projekt samt soundfiles exportieren und mir den link dazu per pn schicken.
    ich bastel dann mal daran rum, garantiere aber nicht für eine sofortige lösung.

    gruß tim
     
  13. krümelmonster, 04.01.2010 #13
    krümelmonster

    krümelmonster Android-Hilfe.de Mitglied

    Beiträge:
    58
    Erhaltene Danke:
    1
    Registriert seit:
    03.01.2010
    ich habs jetzt mal anders gebaut (mediaplayer als instanzvariable), einen globalen stop button gemacht und nun scheint es zu funktionieren. ich bedanke mich schon mal!

    aber die andere frage ist immer noch ob man die länge des sounds ermitteln kann oder ob man rausfinden kann, wann er zu ende abgespielt hat. ich will nämlich verhindern, dass wenn man ausversehen zwei mal den selben button betätigt, dass dann der sound zwei mal übreinander abgespielt wird.
     
  14. SeraphimSerapis, 04.01.2010 #14
    SeraphimSerapis

    SeraphimSerapis Android-Guru

    Beiträge:
    3,072
    Erhaltene Danke:
    1,138
    Registriert seit:
    27.02.2009
    was du auf jeden fall machen könntest, wäre sowas wie eine boolean-variable einführen isPlaying, welche du auf true setzt, wenn du gerade was abspielst, und danach auf false. dann kannste dir das sparen.

    edit: hier eine nette grafik für euch

    [​IMG]

    ich find die jedenfalls nützlich ;)
     
  15. krümelmonster, 04.01.2010 #15
    krümelmonster

    krümelmonster Android-Hilfe.de Mitglied

    Beiträge:
    58
    Erhaltene Danke:
    1
    Registriert seit:
    03.01.2010
    wenn ich diese variable habe kann ich zwar schon verhindern, dass mehrere sounds gleichzeitig abgespielt werden, wie wird diese aber wieder auf false gesetzt? der stop button kann diese funktion übernehmen, jedoch will ich nicht diesen jedes mal drücken, wenn der sound abgespielt wurde. ich brauche so eine art überwacher, der nachschaut, ob der sound zu ende ist und selber diese variable auf false setzt.
     
  16. SeraphimSerapis, 05.01.2010 #16
    SeraphimSerapis

    SeraphimSerapis Android-Guru

    Beiträge:
    3,072
    Erhaltene Danke:
    1,138
    Registriert seit:
    27.02.2009
    hallo, prüfen, ob dein mediaplayer gerade spielt, kannst du doch ganz einfach mit:
    Code:
    isPlaying()
    das liefert dir logischerweise true zurück, wenn er was abspielt, und false, wenn nicht. das kommt dann in eine while.

    while (isPlaying()) {
    ...
    }
    //Hier logischerweise dann nicht mehr am spielen.

    isPlaying()
     
  17. elomanias, 05.01.2010 #17
    elomanias

    elomanias Threadstarter Erfahrener Benutzer

    Beiträge:
    192
    Erhaltene Danke:
    15
    Registriert seit:
    02.12.2009
    hi Seraph

    hab eben festgestellt dass ich durch den tip von gestern von dir
    Code:
    case R.id.button11:
               mp=l;
               break;           
    default:
               mp=null;
    den button abspielen kann
    wenn ich das weitereditiere für die anderen buttons krieg ich nen fehler dass default bereits definiert ist

    vielleicht weisst du wie man das weiter hinbekomt
    break;
     
  18. krümelmonster, 05.01.2010 #18
    krümelmonster

    krümelmonster Android-Hilfe.de Mitglied

    Beiträge:
    58
    Erhaltene Danke:
    1
    Registriert seit:
    03.01.2010
    danke!
    mir war nicht klar, dass es die methode isPlaying() überhaupt gibt. ich dachte, dass du von einer variablen sprachst, die dann aber gesetzt werden sollte.
    aber while(isPlaying()) würde ich nicht machen, dann hätte man busy waiting, was der performance nicht gut tun würde.

    nun funktioniert alles wie es soll. danke!
     
    Zuletzt bearbeitet: 05.01.2010
  19. Jarny, 05.01.2010 #19
    Jarny

    Jarny Android-Experte

    Beiträge:
    520
    Erhaltene Danke:
    38
    Registriert seit:
    01.06.2009
    Schau mal hier:MediaPlayer | Android Developers
    Da gibts die Methode setOnCompletionListener(MediaPlayer.OnCompletionListener listener)
    In dem Listener kannst du dann auch zB. nen Flag zurücksetzen lassen oder beliebige andere Dinge tun.
    Aber wenn du es jetzt eh schon anders gelöst hast ists egal.

    Gruß
    Jarny
     
  20. SeraphimSerapis, 06.01.2010 #20
    SeraphimSerapis

    SeraphimSerapis Android-Guru

    Beiträge:
    3,072
    Erhaltene Danke:
    1,138
    Registriert seit:
    27.02.2009
    war ja auch nur ein beispiel ;)
    viel spaß damit.

    gruß tim
     

Diese Seite empfehlen