Spielen Sie Sound auf Knopfdruck Android


109

Wie bekomme ich eine Schaltfläche, um beim Klicken einen Sound von Raw abzuspielen? Ich habe gerade eine Schaltfläche mit ID erstellt button1, aber welcher Code auch immer ich schreibe, alles ist falsch.

import android.media.MediaPlayer;

public class BasicScreenActivity extends Activity {

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

    Button one = (Button)this.findViewById(R.id.button1);
    MediaPlayer = mp;
    mp = MediaPlayer.create(this, R.raw.soho);
    zero.setOnCliclListener(new View.OnClickListener() )

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



}

Sie möchten wahrscheinlich, dass die Ressourcen automatisch verwaltet werden, damit Sie anrufen können MusicManager.getInstance().play(this, R.raw.my_sound);. Wenn ja, könnte diese Bibliothek für Sie sein: github.com/delight-im/Android-Audio
caw

Antworten:


227

Dies ist der wichtigste Teil des Codes im ursprünglichen Beitrag.

Button one = (Button) this.findViewById(R.id.button1);
final MediaPlayer mp = MediaPlayer.create(this, R.raw.soho);
one.setOnClickListener(new OnClickListener(){

    public void onClick(View v) {
        mp.start();
    }
});

Um es Schritt für Schritt zu erklären:

Button one = (Button) this.findViewById(R.id.button1);

Zunächst wird die Taste initialisiert, die zum Abspielen des Sounds verwendet werden soll. Wir verwenden die Aktivitäten und findViewByIdübergeben die ID, die wir ihr zugewiesen haben (in diesem Beispiel :) R.id.button1, um die Schaltfläche zu erhalten, die wir benötigen. Wir haben es Buttonso umgewandelt, dass es einfach ist, es der Variablen zuzuweisen, die onewir initialisieren. Mehr darüber zu erklären, wie dies funktioniert, ist für diese Antwort nicht möglich. Dies gibt einen kurzen Einblick in die Funktionsweise.

final MediaPlayer mp = MediaPlayer.create(this, R.raw.soho);

So initialisieren Sie a MediaPlayer. Der MediaPlayer folgt dem Entwurfsmuster der statischen Factory-Methode . Um eine Instanz zu erhalten, rufen wir ihre create()Methode auf und übergeben ihr in diesem Fall den Kontext und die Ressourcen-ID des Sounds, den wir abspielen möchten R.raw.soho. Wir erklären es als final. Jon Skeet lieferte eine großartige Erklärung, warum wir dies hier tun .

one.setOnClickListener(new OnClickListener(){

    public void onClick(View v) {
        //code
    }
});

Schließlich legen wir fest, was unsere zuvor initialisierte Schaltfläche tun soll. Spielen Sie einen Sound auf Knopfdruck! Dazu setzen wir den OnClickListenerKnopf one. Im Inneren befindet sich nur eine Methode, onClick()die enthält, welche Anweisungen die Schaltfläche beim Klicken ausführen soll .

public void onClick(View v) {
    mp.start();
}

Um den Sound abzuspielen, rufen wir MediaPlayer an start() Methode von . Diese Methode startet die Wiedergabe des Sounds.

Dort können Sie jetzt einen Sound auf Knopfdruck in Android abspielen!


Bonus-Teil:

Wie im Kommentar unten erwähnt, danke Langusten Gustel! Wie in der Android-Entwicklerreferenz empfohlen , ist es wichtig, die release()Methode aufzurufen , um Ressourcen freizugeben, die nicht mehr verwendet werden. Normalerweise erfolgt dies, sobald der abzuspielende Sound wiedergegeben ist. Dazu fügen wir OnCompletionListenerunserem mp Like Folgendes hinzu:

mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
    public void onCompletion(MediaPlayer mp) {
        //code
    }
});

Innerhalb der onCompletionMethode veröffentlichen wir es wie folgt:

public void onCompletion(MediaPlayer mp) {
    mp.release();
}

Es gibt offensichtlich bessere Möglichkeiten, dies umzusetzen . Beispielsweise können Sie den MediaPlayer zu einer Klassenvariablen machen und seinen Lebenszyklus zusammen mit dem Lebenszyklus des Fragmentoder des Benutzers behandeln Activity. Dies ist jedoch ein Thema für eine andere Frage. Um den Umfang dieser Antwort klein zu halten, habe ich sie geschrieben, um zu veranschaulichen, wie ein Sound beim Klicken auf eine Schaltfläche in Android abgespielt wird .


Ursprünglicher Beitrag

Zuerst. Sie sollten Ihre Anweisungen in einen Block einfügen, in diesem Fall die onCreate-Methode.

Zweite. Sie haben die Schaltfläche als Variable Eins initialisiert , dann eine Variable Null verwendet und ihren onClickListener auf einen unvollständigen onClickListener gesetzt. Verwenden Sie die Variable one für den setOnClickListener.

Drittens setzen Sie die Logik, um den Sound in onClick abzuspielen.

Zusammenfassend:

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

public class BasicScreenActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {        
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_basic_screen);

        Button one = (Button)this.findViewById(R.id.button1);
        final MediaPlayer mp = MediaPlayer.create(this, R.raw.soho);
        one.setOnClickListener(new OnClickListener(){

            public void onClick(View v) {
                mp.start();
            }
        });
    }
}

1
Übrigens sein one.setOnClickListener (neuer View.OnClickListener () {public void onClick (View v) {mp.start ();}}); Verpassen Sie das nicht!
Auto-Droid ツ

7
nicht zu bekommenRELEASE
Langusten Gustel

38

Getestet und 100% funktionsfähig

public class MainActivity extends ActionBarActivity {
    Context context = this;
    MediaPlayer mp;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_layout);
        mp = MediaPlayer.create(context, R.raw.sound);
        final Button b = (Button) findViewById(R.id.Button);
        b.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                try {
                    if (mp.isPlaying()) {
                        mp.stop();
                        mp.release();
                        mp = MediaPlayer.create(context, R.raw.sound);
                    } mp.start();
                } catch(Exception e) { e.printStackTrace(); }
            }
        });
    }
}

Das war alles was wir tun mussten

if (mp.isPlaying()) {
    mp.stop();
    mp.release();
    mp = MediaPlayer.create(context, R.raw.sound);
}

Dies funktioniert auch bei der Wiedergabe des Audios. Beim Abspielen von Sound denke ich, dass mp.start () ohne try / catch und if-Blöcke funktioniert.
Khwilo

37

Der beste Weg, dies zu tun, ist hier, nachdem ich in LogCat nach einem Problem nach dem anderen gesucht habe

MediaPlayer mp;
mp = MediaPlayer.create(context, R.raw.sound_one);
mp.setOnCompletionListener(new OnCompletionListener() {
    @Override
    public void onCompletion(MediaPlayer mp) {
        // TODO Auto-generated method stub
        mp.reset();
        mp.release();
        mp=null;
    }
});
mp.start();

Wenn Sie den Media Player nicht freigeben , wird in LogCat der folgende Fehler angezeigt:

Android: MediaPlayer wurde fertiggestellt, ohne veröffentlicht zu werden

Wenn Sie den Media Player nicht zurücksetzen , wird in LogCat der folgende Fehler angezeigt:

Android: Mediaplayer ging mit unbehandelten Ereignissen weg

Spielen Sie also sicheren und einfachen Code, um den Media Player zu verwenden.

Um mehr als einen Sound in derselben Aktivität / demselben Fragment abzuspielen, ändern Sie einfach die resID, während Sie einen neuen Media Player wie erstellen

mp = MediaPlayer.create(context, R.raw.sound_two);

und spiel es!

Habe Spaß!


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

public class MainActivity extends Activity {
    MediaPlayer mp;
    Button one;

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

        mp = MediaPlayer.create(this, R.raw.soho);
        one = (Button)this.findViewById(R.id.button1);

        one.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                mp.start();
            }
        });
    }
}

Hier ist das Ergebnis, wieder funktioniert nichts dropbox.com/s/9xb0lzesp0ibx9z/2.jpg
Dmitry

Sie benötigen die Zeile mp = new MediaPlayer () nicht, da Sie sie in der nächsten Zeile erneut mit MediaPlayer.create (...) initialisieren.
Keale

6
  • Das Audio muss in der platziert werden raw Ordner Wenn es nicht vorhanden ist, erstellen Sie einen.
  • Der unformatierte Ordner muss sich im res-Ordner befinden
  • Der Name darf keine -oder Sonderzeichen enthalten.

Auf Ihrer Aktivität, müssen Sie ein Objekt haben MediaPlayer, innerhalb des onCreateVerfahrens oder die onclickMethode, müssen Sie die Initialisierung MediaPlayer, wie MediaPlayer.create(this, R.raw.name_of_your_audio_file)dann die Audiodatei ir bereit , mit der Aufforderung zur abgespielt wird start(), in Ihrem Fall, da Sie es sein wollen Wenn Sie es in eine Schaltfläche einfügen, müssen Sie es in die onClickMethode einfügen.

Beispiel:

private Button myButton;
private MediaPlayer mp;
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.myactivity);
        mp = MediaPlayer.create(this, R.raw.gunshot);

        myButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mp.start();
            }
        });
}
}

3

Es gibt einige vordefinierte Sounds: SHUTTER_CLICK, FOCUS_COMPLETE, START_VIDEO_RECORDING, STOP_VIDEO_RECORDING.

Nett!

MediaActionSound

Eine Klasse zum Erzeugen von Sounds, die denen entsprechen, die durch verschiedene Aktionen der Medien- und Kamera-APIs erzeugt wurden. Docs

Verwenden Sie wie:

fun playBeepSound() {
    val sound = MediaActionSound()
    sound.play(MediaActionSound.START_VIDEO_RECORDING)
}

2
Button button1=(Button)findViewById(R.id.btnB1);
button1.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
MediaPlayer mp1 = MediaPlayer.create(this, R.raw.b1);
mp1.start();
}
});

Versuchen Sie dies, ich denke, es wird funktionieren


1
public class MainActivity extends AppCompatActivity {

    public void clickMe (View view) {

        MediaPlayer mp = MediaPlayer.create(this, R.raw.xxx);
        mp.start();

    }

Erstellen einer Schaltfläche mit einer Methode kann aufgerufen werden, wenn die Schaltfläche gedrückt wird (onCreate).

Erstellen Sie dann eine Variable für die Klasse (MediaPlayer) mit dem Pfad Ihrer Datei

MediaPlayer mp = MediaPlayer.create(this, R.raw.xxx);

Führen Sie schließlich die Startmethode in dieser Klasse aus

mp.start();

Die Datei wird ausgeführt, wenn die Taste gedrückt wird. Ich hoffe, dies war hilfreich!


3
Willkommen bei Stack Overflow! Es ist besser, wenn Sie Ihrem Code Erklärungen und Kommentare hinzufügen, damit zukünftige Leser von Ihnen lernen können.
Mehdi Bounya

1

Anstatt es wie von DeathRs vorgeschlagen zurückzusetzen:

if (mp.isPlaying()) {
       mp.stop();
       mp.release();
       mp = MediaPlayer.create(context, R.raw.sound);
} mp.start();

Wir können den MediaPlayer einfach so zurücksetzen, dass er verwendet wird:

if (mp.isPlaying()) {
       mp.seekTo(0)
}

1

Alle diese Lösungen "klingen" nett und vernünftig, aber es gibt einen großen Nachteil. Was passiert, wenn Ihr Kunde Ihre Anwendung herunterlädt und wiederholt auf Ihre Schaltfläche drückt?

Ihre MediaPlayer können Ihren Sound manchmal nicht abspielen, wenn Sie zu oft auf die Schaltfläche klicken.

Ich bin vor MediaPlayerein paar Tagen mit der Klasse auf dieses Leistungsproblem gestoßen.

Ist die MediaPlayerKlasse sicher zu verwenden? Nicht immer. Wenn Sie kurze Töne haben, ist es besser, die zu verwendenSoundPool Klasse zu verwenden.

Eine sichere und effiziente Lösung ist die SoundPool-Klasse, die großartige Funktionen bietet und die Leistung Ihrer Anwendung erhöht.

SoundPool ist nicht so einfach zu bedienen wie das MediaPlayer Klasse, bietet jedoch einige große Vorteile in auf Leistung und Zuverlässigkeit.

Folgen Sie diesem Link und erfahren Sie, wie Sie die SoundPool-Klasse in Ihrer Anwendung verwenden:

https://developer.android.com/reference/android/media/SoundPool

Youtube: Lösung speichern

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.