先不多说,直接上代码
public class SimpleMediaPlayerActivity extends Activity {
//private static final Uri mMusicUri = Uri.fromFile(new File("/sdcard/sound_file_1.mp3"));
private static final Uri mMusicUri = Uri.parse("http://czanxi.azone.artron.net/users_info/88/czanxi/2009121322260351292.mp3");
private MediaPlayer mMediaPlayer = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
playMusic1();
}
/**
* 第一种方式,通过create创建
*/
private void playMusic1() {
stopCurrentMediaPlayer();
mMediaPlayer = MediaPlayer.create(this, mMusicUri); //prepared
mMediaPlayer.start(); // no need to call prepare(); create() does that for you
}
/**
* 第二种方式,通过new MediaPlayer()创建,通过prepare
*/
private void playMusic2() {
stopCurrentMediaPlayer();
mMediaPlayer = new MediaPlayer(); //idle
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
try {
mMediaPlayer.setDataSource(getApplicationContext(), mMusicUri);
mMediaPlayer.prepare();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
mMediaPlayer.start();
}
/**
* 第三种方式,通过new MediaPlayer()创建,通过prepareAsync
*/
private void playMusic3() {
mMediaPlayer = new MediaPlayer() ;
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC) ;
mMediaPlayer.setOnPreparedListener(new OnPreparedListener()
{
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
mediaPlayer.start() ;
}
}) ;
try {
mMediaPlayer.setDataSource(getApplicationContext(), mMusicUri);
mMediaPlayer.prepareAsync() ;//异步加载
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
protected void onDestroy() {
stopCurrentMediaPlayer();
super.onDestroy();
}
private void stopCurrentMediaPlayer() {
if (mMediaPlayer != null) {
mMediaPlayer.stop();
mMediaPlayer.release();
mMediaPlayer = null;
}
}
}
第一种方式和二、三中的区别是:
new 之后是idle状态 ,create之后是 prepared状态。这也是为何我们在调用create之后不需要再手动调用prepare()方法去更改状态。
第一种、第二种和第三种的区别是:
前两种为同步方式,因为涉及到识别及解码等IO耗时操作,容易引起主线程堵塞。第三种为异步方式,不会引发此问题,推荐此方式。