Ответ 1
mp = MediaPlayer.create(...);
уже готовит возвращенный MediaPlayer, поэтому вы не можете снова вызывать prepare
(или его варианты) (и также нет необходимости в onPreparedListener).
05-19 11:52:51.622: ERROR/MediaPlayer(1291): prepareAsync called in state 8
05-19 11:52:51.622: WARN/System.err(1291): java.lang.IllegalStateException
try {
mp = MediaPlayer.create(
Main.this,
Uri.parse("http://codejanitor.us/good.mp3"));
mp.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
try {
mp.prepareAsync();
} catch (IllegalStateException e) {
e.printStackTrace();
}
} finally {
if (mp != null) {
mp.release();
mp = null;
}
}
ПООЧЕРЕДНОГО
Если я это сделаю:
try {
mp = MediaPlayer.create(
AmazonClipActivity.this,
Uri.parse("http://codejanitor.us/good.mp3"));
mp.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
} finally {
if (mp != null) {
mp.release();
mp = null;
}
}
Я получаю:
05-19 12:22:57.472: DEBUG/MediaPlayer(1635): Couldn't open file on client side, trying server side
05-19 12:22:57.472: INFO/StagefrightPlayer(68): setDataSource('http://codejanitor.us/good.mp3')
05-19 12:22:57.482: INFO/NuHTTPDataSource(68): connect to codejanitor.us:80/good.mp3 @0
05-19 12:23:00.632: INFO/NuCachedSource2(68): ERROR_END_OF_STREAM
mp = MediaPlayer.create(...);
уже готовит возвращенный MediaPlayer, поэтому вы не можете снова вызывать prepare
(или его варианты) (и также нет необходимости в onPreparedListener).
"prepareAsync, вызываемый в состоянии 8" , означает, что медиапланер уже подготовлен.
Вы звоните mp.prepare();
в свой код?
Ваш обновленный вопрос:
AndroidManifest.xml
onPrepared()
никогда не будет вызван.Лучше всего было бы написать:
MediaPlayer mp = new MediaPlayer();
mp.setDataSource("http://.../movie.mp4");
mp.setOnPreparedListener(this);
mp.prepareAsync();
Я использую ниже код для воспроизведения звуковых файлов для http.
BackgroundSound mBackgroundSound = new BackgroundSound();
public void onSoundRequested(final Uri uri) {
mBackgroundSound = new BackgroundSound();
mBackgroundSound.execute(new SoundModel(dicId, uri));
}
public class BackgroundSound extends AsyncTask<SoundModel, Void, Void> {
MediaPlayer mediaPlayer;
@Override
protected Void doInBackground(SoundModel... params) {
SoundModel model = params[0];
final Uri uri = model.getUri();
if (uri == null || uri == Uri.EMPTY) return null;
if (mediaPlayer != null) mediaPlayer.stop();
try {
mediaPlayer = MediaPlayer.create(VocabularyActivity.this, uri);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
} catch (Exception e) {
// do nothing.
}
if (mediaPlayer == null) return null;
mediaPlayer.setVolume(1.0f, 1.0f);
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mediaPlayer.reset();
mediaPlayer.release();
mediaPlayer = null;
}
});
mediaPlayer.start();
return null;
}
}
Он показывает warnimg W/MediaPlayer: Couldn't open https://something.com/test.mp3: java.io.FileNotFoundException: No content provider: https://something.com/test.mp3
, но отлично работает.
Основная проблема заключается в вызове методов MediaPlayer
в "недопустимых состояниях". Диаграмма состояния показана здесь. Например, вызов метода start()
без подготовки файла мультимедиа недопустим и вызовет исключение.
Поскольку MediaPlayer
не предоставляет getState()
, вы должны отслеживать состояния извне. Пример реализации можно найти здесь.