web-dev-qa-db-fra.com

Erreur Android MediaPlayer (-38, 0) "arrêt appelé à l'état 0"

J'ai consulté différents sites Web à la recherche d'une solution à ce problème dans mon code. C'est un lecteur audio basique avec 3 boutons: play, pause et stop. La lecture et la pause fonctionnent bien et s’arrêtent mais une fois que le son est arrêté, il refuse de recommencer, en générant une erreur:

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

Ceci est mon 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);
    }
}
}

Et 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>

Si quelqu'un pouvait m'aider à résoudre cette erreur, ce serait très apprécié. J'ai déjà cherché des solutions et essayé plusieurs solutions, mais aucune ne semblait fonctionner correctement.

EDIT: J'ai changé un peu du code:

Ma question concerne toujours l'erreur, et voici maintenant mon code modifié:

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);
    }
}
}

J'ai aussi essayé de faire fonctionner les bases sans une barre de recherche, juste pour m'assurer que cela ne causait pas d'erreur, mais cela se situait quelque part dans la logique du code lecture/pause/arrêt, car il produisait la même erreur même avec le code de recherche. omis.

10
uberdum05

Le problème est qu'une fois que vous l'avez arrêté, vous setDataSource à nouveau. Vous devez ensuite appeler prepare()

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

Chaque fois que vous appelez setDataSource(), vous devrez le prepare() à nouveau. Considérez-le comme charger le fichier et vous préparer pour la lecture.

En passant, je remarque que vous confondez appeler MediaPlayer.create() et également appeler setDataSource() plusieurs fois pour le même fichier. Il n'y a pas besoin de faire ça. Une fois que MediaPlayer est créé et préparé (ce que l'appel .create() fait pour vous), vous pouvez simplement appeler .stop(), .pause(), .play(), inutile de le réinitialiser à tout moment.

8
Ken Wolf

J'ai résolu ce problème en supprimant la player.stop() qui était appelée lorsque le lecteur a terminé la chanson à cause de player.setOnCompletionListener(). Cela a maintenant résolu le problème et le lecteur fonctionne parfaitement.

1
uberdum05

J'ai résolu ce problème avec `mediaPlayer.prepare (); Mon problème concerne le streaming radio en direct et je parviens à résoudre ce problème comme ci-dessous:

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