wake-up-neo.com

Probleme mit dem MediaPlayer, rohe Ressourcen, stoppen und starten

Ich bin neu in der Android-Entwicklung und habe eine Frage/ein Problem. 

Ich spiele mit der MediaPlayer-Klasse herum, um Sounds/Musik wiederzugeben. Ich spiele rohe Ressourcen (res/raw) und es sieht irgendwie einfach aus.

Um eine Rohressource abzuspielen, muss der MediaPlayer folgendermaßen initialisiert werden:


MediaPlayer mp = MediaPlayer.create(appContext, R.raw.song);
mp.start();

Bis hier gibt es kein Problem. Der Ton wird abgespielt und alles funktioniert gut. Mein Problem tritt auf, wenn ich meiner Anwendung weitere Optionen hinzufügen möchte. Speziell wenn ich die "Stop" -Schaltfläche/-option hinzufüge.

Grundsätzlich möchte ich ... wenn ich auf "Stop" drücke, stoppt die Musik. Und wenn ich "Start" drücke, beginnt der Song/Sound erneut. (ziemlich einfach!)

Um den Mediaplayer anzuhalten, müssen Sie nur stop() aufrufen. Um den Ton abermals wiederzugeben, muss der Mediaplayer zurückgesetzt und vorbereitet werden.


mp.reset();
mp.setDataSource(params);
mp.prepare();

Das Problem ist, dass die Methode setDataSource() nur einen Dateipfad, einen Inhaltsanbieter-URI, einen Streaming-Media-URL-Pfad oder einen Dateideskriptor als Parameter akzeptiert.

Da diese Methode keine Ressourcenkennung akzeptiert, kann ich die Datenquelle nicht festlegen, um prepare() aufzurufen. Außerdem verstehe ich nicht, warum Sie keine Resouce-Kennung verwenden können, um die Datenquelle festzulegen. Sie können jedoch eine Ressourcen-Kennung verwenden, wenn Sie den MediaPlayer initialisieren.

Ich vermute, mir fehlt etwas. Ich frage mich, ob ich Konzepte mische, und die Methode stop() muss nicht in der Schaltfläche "Stop" aufgerufen werden. Irgendeine Hilfe?

Danke im Voraus!!!

24
arakn0

So habe ich mehrere Ressourcen mit einem einzigen MediaPlayer geladen:

/**
 * Play a sample with the Android MediaPLayer.
 *
 * @param resid Resource ID if the sample to play.
 */
private void playSample(int resid)
{
    AssetFileDescriptor afd = context.getResources().openRawResourceFd(resid);

    try
    {   
        mediaPlayer.reset();
        mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength());
        mediaPlayer.prepare();
        mediaPlayer.start();
        afd.close();
    }
    catch (IllegalArgumentException e)
    {
        Log.e(TAG, "Unable to play audio queue do to exception: " + e.getMessage(), e);
    }
    catch (IllegalStateException e)
    {
        Log.e(TAG, "Unable to play audio queue do to exception: " + e.getMessage(), e);
    }
    catch (IOException e)
    {
        Log.e(TAG, "Unable to play audio queue do to exception: " + e.getMessage(), e);
    }

mediaPlay ist eine Membervariable, die an anderen Stellen in der Klasse erstellt und freigegeben wird. Dies ist möglicherweise nicht der beste Weg (ich bin neu bei Android selbst), aber es scheint zu funktionieren. Beachten Sie jedoch, dass der Code wahrscheinlich bis zum Ende der Methode reicht, bevor der MediaPlayer abgespielt wird. Wenn Sie eine Reihe von Ressourcen spielen müssen, müssen Sie diesen Fall trotzdem bearbeiten.

27
adstro

so funktioniert die MediaPlayer.create -Methode, um eine Rohdatei zu öffnen:

    public static MediaPlayer create(Context context, int resid) {
         try {
             AssetFileDescriptor afd = context.getResources().openRawResourceFd(resid);
             if (afd == null) return null;

             MediaPlayer mp = new MediaPlayer();
             mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
             afd.close();
             mp.prepare();
            return mp;
        } catch (IOException ex) {
            Log.d(TAG, "create failed:", ex);
            // fall through
        } catch (IllegalArgumentException ex) {
            Log.d(TAG, "create failed:", ex);
           // fall through
        } catch (SecurityException ex) {
            Log.d(TAG, "create failed:", ex);
            // fall through
        }
         return null;
    }
15
mishkin

Oder Sie können auf die Ressource auf folgende Weise zugreifen:

mediaPlayer.setDataSource(context, Uri.parse("Android.resource://com.package.name/raw/song"));

dabei ist com.package.name der Name Ihres Anwendungspakets

9

Sie können verwenden 

mp.pause();
mp.seekTo(0);

um den Player zu stoppen.

4
Rectangle

Zum Schluss funktioniert es bei mir:

public class MainStart extends Activity {

    ImageButton buttonImage;
    MediaPlayer mp;
    Boolean playing = false;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main);

        buttonImage = (ImageButton)findViewById(R.id.ButtonID);


        buttonImage.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                if(playing){
                    mp.stop();
                    playing = false;
                }else{
                    mp = MediaPlayer.create(getApplicationContext(), R.raw.sound_u_want);
                    mp.start();
                    playing = true;
                }
            }
        });
    }
}
3
MarcBilbo

HERR. Rechteck, diese Nachricht ist vielleicht zu spät dafür, aber ich schreibe stolz diese Codes zu Ihrer Idee: Ich habe mp für mediaplayer und sescal9 ist eine button.

....
if(btnClicked.getId() == sescal9_ornek_muzik.getId())
        {
            mp.start();
            mp.seekTo(380);
            mp2.start();
            mp2.seekTo(360);
            mp3.start();
            mp3.seekTo(340);
            ...
            }
0
Bay