我正在学习实施媒体播放器服务。 MediaPlayerFragment有3个url_selection按钮和一个播放/停止按钮。使用url_selection按钮,我设置了setDataSource的URL。如果播放/停止按钮是停止或播放媒体播放器。
首先点击url_selection并点击播放/停止按钮将播放并更改图标。如果再次单击播放/停止按钮或单击其他url_selection,则应停止播放并播放/停止显示停止图标。
播放停止和网址选择正在运行但是。一旦媒体播放器停止,对于另一个网址,我将获得非法例外。这可能是因为我正在调用player.reset,player = null。但如果我不这样做,则player.setDataSource失败。 以下是实施片段:
public static MediaPlayer player = new MediaPlayer();
public int onStartCommand(Intent intent, int flags, int startid) {
Toast.makeText(this, "started service", Toast.LENGTH_LONG).show();
try {
Log.e("player_status", "" + player);
String url = intent.getStringExtra("URL_NAME");
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
player.reset();
player.setDataSource(url);
player.prepareAsync();
player.setOnPreparedListener(this);
player.setOnErrorListener(this);
player.setOnCompletionListener(this);
} catch (Exception e) {
// TODO: handle exception
Log.e("start", "" + e);
}
return START_STICKY;
@Override
public int onStartCommand(Intent intent, int flags, int startid) {
Toast.makeText(this, "started service", Toast.LENGTH_LONG).show();
try {
Log.e("player_status", "" + player);
String url = intent.getStringExtra("URL_NAME");
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
player.reset();
player.setDataSource(url);
player.prepareAsync();
player.setOnPreparedListener(this);
player.setOnErrorListener(this);
player.setOnCompletionListener(this);
} catch (Exception e) {
// TODO: handle exception
Log.e("start", "" + e);
}
return START_STICKY;
}
@Override
public void onPrepared(MediaPlayer mp) {
// TODO Auto-generated method stub
try {
player.start();
} catch (Exception e) {
// TODO: handle exception
Log.e("onPrepare", "" + e);
}
}
我在一些无法识别的地方做错了。如果没有播放,则单击播放/停止应播放(如果没有单击url_section,则首次播放url1),如果播放则应停止播放。在播放/停止状态下,url_selection应该停止媒体播放器。用户应再次单击播放/停止按钮以使用所选网址启动播放器。
不在stop中赋值null会在setDataSource()中出现错误,并设置null偏离当然抛出异常。