webentwicklung-frage-antwort-db.com.de

Android MediaPlayer-Fehler (-38, 0) "Stop im Status aufgerufen"

Ich habe auf verschiedenen Websites nach einer Lösung für dieses Problem in meinem Code gesucht. Es ist ein grundlegender Audioplayer mit 3 Tasten: Wiedergabe, Pause und Stopp. Wiedergabe und Pause funktionieren einwandfrei und hören auch auf, aber wenn der Ton einmal gestoppt wurde, wird er nicht mehr gestartet, und es wird ein Fehler ausgegeben:

E/MediaPlayer: stop called in state 0
E/MediaPlayer: error (-38, 0)
E/MediaPlayer: Error (-38,0)

Das ist meine MainActivity.Java:

import Android.app.Activity;
import Android.media.MediaPlayer;
import Android.net.Uri;
import Android.os.Bundle;
import Android.os.Handler;
import Android.view.Menu;
import Android.view.View;
import Android.widget.Button;
import Android.widget.SeekBar;

import Java.io.IOException;

public class MainActivity extends Activity implements MediaPlayer.OnPreparedListener {

    static Button playButton;
    static Button pauseButton;
    static Button stopButton;
    static SeekBar seekBar;
    private static MediaPlayer player;
static Handler handler;
static Uri audio;

@Override
protected void onCreate(Bundle savedInstanceState) {
    player = MediaPlayer.create(this, R.raw.airbourne_runnin_wild);
    Uri audio = Uri.parse("Android.resource://" + getPackageName() + "/" + R.raw.airbourne_runnin_wild);
    try {
        player.setDataSource(getAssets().openFd("raw/airbourne_runnin_wild.mp3").getFileDescriptor());
    } catch (IOException e) {
        e.printStackTrace();
    }
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    playButton = (Button) findViewById(R.id.playButton);
    pauseButton = (Button) findViewById(R.id.pauseButton);
    stopButton = (Button) findViewById(R.id.stopButton);
    seekBar = (SeekBar) findViewById(R.id.seekBar);

    player.setOnPreparedListener(this);

    handler = new Handler();

    seekBar.setMax(player.getDuration());

    playButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            if (!player.isPlaying()) {
                try {
                    player.setDataSource(getAssets().openFd("raw/airbourne_runnin_wild.mp3").getFileDescriptor());
                } catch (IOException e) {
                    e.printStackTrace();
                }
                player.start();
                updateSeekBar();
            }
        }
    });

    pauseButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            if (player.isPlaying()) {
                player.pause();
            }
        }
    });

    stopButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            if (player.isPlaying()) {
                player.stop();
                seekBar.setProgress(0);
                seekBar.invalidate();
                try {
                    player.setDataSource(getAssets().openFd("raw/airbourne_runnin_wild.mp3").getFileDescriptor());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    });

    seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
            if (b) {
                seekChanged(seekBar, i, b);
            }
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    });

    player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mediaPlayer) {
            player.stop();
            seekBar.setProgress(0);
            //player.prepareAsync();
            seekBar.invalidate();
        }
    });
}


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

@Override
public void onPrepared(MediaPlayer mediaPlayer) {
    playButton.setEnabled(true);
}

public void seekChanged(SeekBar seekBar, int progress, boolean fromUser) {
    player.seekTo(progress);
}

public void updateSeekBar() {
    seekBar.setProgress(player.getCurrentPosition());

    if (player.isPlaying()) {
        Runnable notification = new Runnable() {
            public void run() {
                updateSeekBar();
            }
        };
        handler.postDelayed(notification, 1500);
    }
}
}

Und activity_main.xml:

<TableLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:paddingLeft="@dimen/activity_horizontal_margin"
Android:paddingRight="@dimen/activity_horizontal_margin"
Android:paddingTop="@dimen/activity_vertical_margin"
Android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity">

<TableRow
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent">

    <Button
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="Play"
            Android:id="@+id/playButton"
            Android:layout_gravity="center_horizontal|top"
            Android:longClickable="false"
            Android:layout_weight="1"
            Android:layout_column="8"
            Android:enabled="false"/>
</TableRow>

<TableRow
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent">

    <Button
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="Pause"
            Android:id="@+id/pauseButton"
            Android:layout_gravity="center_horizontal|top"
            Android:layout_weight="1"
            Android:layout_column="8"
            Android:layout_span="7"/>
</TableRow>

<TableRow
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent">

    <Button
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="Stop"
            Android:id="@+id/stopButton"
            Android:layout_column="8"
            Android:layout_span="24"
            Android:layout_weight="1"/>
</TableRow>

<TableRow
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent">
</TableRow>

<TableRow
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent">

    <SeekBar
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:id="@+id/seekBar"
            Android:layout_column="8"
            Android:layout_span="24"
            Android:layout_weight="1"/>
</TableRow>

Wenn jemand mir helfen könnte, diesen Fehler zu beheben, wäre er sehr dankbar. Ich habe bereits nach Lösungen gesucht und mehrere ausprobiert, aber keine schien richtig zu funktionieren.

EDIT: Ich habe den Code ein wenig geändert:

Meine Frage bezieht sich immer noch auf den Fehler, und dies ist jetzt mein bearbeiteter Code:

import Android.app.Activity;
import Android.media.MediaPlayer;
import Android.net.Uri;
import Android.os.Bundle;
import Android.os.Handler;
import Android.view.Menu;
import Android.view.View;
import Android.widget.Button;
import Android.widget.SeekBar;

import Java.io.IOException;

public class MainActivity extends Activity implements MediaPlayer.OnPreparedListener {

static Button playButton;
static Button pauseButton;
static Button stopButton;
static SeekBar seekBar;
private static MediaPlayer player;
static Handler handler;
static Uri audio;
static boolean canMakeCall = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
    player = MediaPlayer.create(this, R.raw.airbourne_runnin_wild);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    playButton = (Button) findViewById(R.id.playButton);
    pauseButton = (Button) findViewById(R.id.pauseButton);
    stopButton = (Button) findViewById(R.id.stopButton);
    seekBar = (SeekBar) findViewById(R.id.seekBar);

    if (canMakeCall = true) {
        player.setOnPreparedListener(this);

        handler = new Handler();

        seekBar.setMax(player.getDuration());

        playButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                if (!player.isPlaying()) {
                    player.start();
                    updateSeekBar();
                }
            }
        });

        pauseButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                if (player.isPlaying()) {
                    player.pause();
                }
            }
        });

        stopButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                if (player.isPlaying()) {
                    player.stop();
                    seekBar.setProgress(0);
                    seekBar.invalidate();
                    try {
                        player.prepare();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        });

        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
                if (b) {
                    seekChanged(seekBar, i, b);
                }
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });

        player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mediaPlayer) {
                mediaPlayer.stop();
                //player.stop();

                seekBar.setProgress(0);
                //player.prepareAsync();
                seekBar.invalidate();
            }
        });
    }
}


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

@Override
public void onPrepared(MediaPlayer mediaPlayer) {
    playButton.setEnabled(true);
    canMakeCall = true;
}

public void seekChanged(SeekBar seekBar, int progress, boolean fromUser) {
    player.seekTo(progress);
}

public void updateSeekBar() {
    seekBar.setProgress(player.getCurrentPosition());

    if (player.isPlaying()) {
        Runnable notification = new Runnable() {
            public void run() {
                updateSeekBar();
            }
        };
        handler.postDelayed(notification, 1500);
    }
}
}

Ich habe versucht, die Grundlagen auch ohne Suchleiste zum Laufen zu bringen, nur um sicherzustellen, dass dies keinen Fehler verursacht, sondern irgendwo in der Logik des Wiedergabe-/Pause-/Stopp-Codes liegt, da er selbst mit dem Suchleistencode den gleichen Fehler verursachte weggelassen.

10
uberdum05

Das Problem ist, dass Sie, sobald Sie es gestoppt haben, wieder setDataSource sind. Sie müssen dann prepare() aufrufen

player.setDataSource(getAssets().openFd("raw/airbourne_runnin_wild.mp3").getFileDescriptor());
player.prepare();

Jedes Mal, wenn Sie setDataSource() aufrufen, müssen Sie prepare() erneut ausführen. Stellen Sie sich vor, Sie laden die Datei und bereiten sich auf die Wiedergabe vor.

Übrigens fällt mir auf, dass Sie MediaPlayer.create() und setDataSource() für dieselbe Datei mehrfach aufrufen. Es besteht keine Notwendigkeit, dies zu tun. Sobald der MediaPlayer erstellt und vorbereitet ist (welcher Aufruf .create() für Sie erledigt), können Sie einfach .stop(), .pause(), .play() darauf aufrufen, ohne ihn die ganze Zeit zurücksetzen zu müssen.

8
Ken Wolf

Ich habe dieses Problem behoben, indem ich die player.stop() entfernt habe, die aufgerufen wurde, als der Player das Lied wegen player.setOnCompletionListener() beendet hat. Damit ist das Problem behoben und der Player funktioniert einwandfrei.

1
uberdum05

Ich habe dieses Problem mit `mediaPlayer.prepare () behoben; Mein Problem ist über das Live-Radio-Streaming und ich erreiche dieses Problem wie folgt Code:

if (!radioIsOpen) {
                try {
                    mediaPlayer = new MediaPlayer();
                    mediaPlayer
                            .setDataSource(URL);
                    mediaPlayer.prepare();
                } catch (Exception e) {
                }

                mediaPlayer.setOnPreparedListener(new OnPreparedListener() {

                    public void onPrepared(MediaPlayer mp) {
                        mediaPlayer.start();
                    }
                });
                Toast.makeText(getBaseContext(), "Radio is opening...", 2).show();
            } else {
                if (mediaPlayer.isPlaying()) {
                    mediaPlayer.stop();
                    mediaPlayer.release();
                    Toast.makeText(getBaseContext(), "Radio is closing...", 2).show();
                }
            }
0
Cüneyt