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