1
現在、音楽プレーヤーをストリームする簡単なアプリケーションを設計しようとしています。私は歌のURLを持っており、以下のようにMediaPlayer
を設定しています。すべては最初の曲でOKですが、私は他の曲を再生するときにエミュレートする場合、プログラムがクラッシュしていないが、何も演奏されていないと、私は次のエラーを取得しています:MediaPlayerエラーコード(-38,0)getDuration
E/MediaPlayer: Attempt to call getDuration without a valid mediaplayer
E/MediaPlayer: error (-38, 0)
E/MediaPlayer: Error (-38,0)
PlayerService.java
をpublic class MusicPlayerService extends Service {
private SongItem mSong;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
mSong = ListSong.getListSong().get(ListSong.getSelectedItem());
registerLocalFilter();
playMedia();
return START_STICKY;
}
private void playMedia() {
if (handler == null) {
thread = new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare();
handler = new Handler();
handler.post(playAudioFromURL);
Looper.loop();
}
});
thread.start();
} else {
handler.post(playAudioFromURL);
}
}
private Runnable playAudioFromURL = new Runnable() {
@Override
public void run() {
if (mediaPlayer != null) {
mediaPlayer.release();
}
mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
try {
mediaPlayer.setDataSource(mSong.getSongUrl());
mediaPlayer.setOnPreparedListener(onPreparedListener);
mediaPlayer.setOnCompletionListener(onCompletionListener);
mediaPlayer.setOnSeekCompleteListener(onSeekCompleteListener);
mediaPlayer.setOnErrorListener(onErrorListener);
mediaPlayer.prepareAsync();
} catch (IOException e) {
e.printStackTrace();
Log.w(TAG, "playAudioFromURL: " + e.toString());
} catch (IllegalArgumentException ex) {
Log.w(TAG, "playAudioFromURL: " + ex.toString());
} catch (IllegalStateException ex) {
Log.w(TAG, "playAudioFromURL: " + ex.toString());
}
}
};
private MediaPlayer.OnPreparedListener onPreparedListener = new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
ListSong.setPlaying(true);
sendLoadComplete();
updateTimer();
mp.start();
}
};
}
私はonPrepared()
での書き込みmp.start()
とMedia Player called in state 0, error (-38,0)で溶液のようなmediaPlayer.prepareAsync();
を使用してを持っているが、それは働いていません。
私を助けてください!
** may **?それはコメントの仲間にすべきです! – Gattsu