MediaPlayer简易应用

    本次的要求是做出一个简易的带滚动条的音频播放界面。(为了不影响大家学习,完整代码在文章最后附加)

 

第一部分:滚动条的实现(此处用的是安卓自带的SeekBar)

布局文件:

<SeekBar
android:id="@+id/seekBar"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

Java代码:

private void initViews(){
music=(EditText)findViewById(R.id.music);//在布局中定义好的一个用来传输要播放网络文件位置的文本
playBtn=(ImageButton)findViewById(R.id.play);
seekBar=(SeekBar)findViewById(R.id.seekBar);

//给滚动条设置监听事件,重写了三个方法,此处只用到后两个
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

}

//开始触摸
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
isChange=true;
}

//停止触摸
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
//设置歌曲的进度为当前seekBar的进度
player.seekTo(seekBar.getProgress());
isChange=false;
}
});

 

 

第二部分:使用MediaPalyer加载音乐文件

player=new MediaPlayer();
Uri uri=Uri.parse(music.getText().toString());
try {
player.setDataSource(this, uri);
//异步加载媒体流
player.prepareAsync();

//添加一个准备状态的监听事件
player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
//准备完毕
//开启定时器设置进度条(第三部分),必须要在准备完成后才可以调用定时器方法,将两部分相关联
initTimer();
Toast.makeText(MediaDemoActivity.this, "歌曲准备完毕", Toast.LENGTH_SHORT).show();
player.start();

//改变此时的ImageButton的样式
playBtn.setImageResource(R.mipmap.a8o);
findViewById(R.id.back).setOnClickListener(MediaDemoActivity.this);
playBtn.setOnClickListener(MediaDemoActivity.this);
findViewById(R.id.to).setOnClickListener(MediaDemoActivity.this);
}
});

//设置一个特殊情况的监听:比如断网,网络歌曲不存在之类的
player.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
//出现错误
Toast.makeText(MediaDemoActivity.this, "无网络或歌曲链接无效", Toast.LENGTH_SHORT).show();
return false;
}
});

//播放完成监听
player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
//播放完毕
}
});
} catch (IOException e) {
e.printStackTrace();
}
}

第三部分:使用定时器将进度条与音频文件关联起来

private void initTimer(){
//设置进度条长度
seekBar.setMax(player.getDuration());
timer=new Timer();
task=new TimerTask() {
@Override
public void run() {
//定时器执行:设置进度条
if(!isChange) {
seekBar.setProgress(player.getCurrentPosition());
}
}
};
timer.schedule(task,0,1000);
}

 

附加代码:

private EditText music;
private MediaPlayer player;
private ImageButton playBtn;//播放键
private SeekBar seekBar;
private Timer timer;
private TimerTask task;
private boolean isChange;//默认没有拖拽

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_media_demo);
initViews();
}

private void initViews(){
music=(EditText)findViewById(R.id.music);
playBtn=(ImageButton)findViewById(R.id.play);
seekBar=(SeekBar)findViewById(R.id.seekBar);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

}

//开始触摸
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
isChange=true;
}

//停止触摸
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
//设置歌曲的进度为当前seekBar的进度
player.seekTo(seekBar.getProgress());
isChange=false;
}
});
findViewById(R.id.start).setOnClickListener(this);
findViewById(R.id.pause).setOnClickListener(this);
findViewById(R.id.stop).setOnClickListener(this);
findViewById(R.id.restart).setOnClickListener(this);
findViewById(R.id.copy).setOnClickListener(this);
//输入框修改监听
music.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {

}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {

}

@Override
public void afterTextChanged(Editable s) {
//当音乐发生变化时,停止播放
// stopPlay();
}
});
player=new MediaPlayer();
Uri uri=Uri.parse(music.getText().toString());
try {
player.setDataSource(this, uri);
//异步加载媒体流
player.prepareAsync();
player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
//准备完毕
//开启定时器设置进度条
initTimer();
Toast.makeText(MediaDemoActivity.this, "歌曲准备完毕", Toast.LENGTH_SHORT).show();
player.start();
playBtn.setImageResource(R.mipmap.a8o);
findViewById(R.id.back).setOnClickListener(MediaDemoActivity.this);
playBtn.setOnClickListener(MediaDemoActivity.this);
findViewById(R.id.to).setOnClickListener(MediaDemoActivity.this);
}
});
player.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
//错误监听
Toast.makeText(MediaDemoActivity.this, "无网络或歌曲链接无效", Toast.LENGTH_SHORT).show();
return false;
}
});
player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
//播放完毕
}
});
} catch (IOException e) {
e.printStackTrace();
}
}

private void initTimer(){
//设置进度条长度
seekBar.setMax(player.getDuration());
timer=new Timer();
task=new TimerTask() {
@Override
public void run() {
//定时器执行:设置进度条
if(!isChange) {
seekBar.setProgress(player.getCurrentPosition());
}
}
};
timer.schedule(task,0,1000);

private void play(){
//判断当前是否正在播放歌曲
if(player.isPlaying()) {
//播放就暂停
playBtn.setImageResource(R.mipmap.a8q);
player.pause();
} else {
//未播放就开始播放
playBtn.setImageResource(R.mipmap.a8o);
player.start();
}
}

private void toPlay() {
//快进5秒
//先获取当前正在播放的位置
int currentPosition=player.getCurrentPosition();
//获取歌曲总长度
int duration=player.getDuration();
//当前位置添加五秒后不大于歌曲总长度才可以添加
if(duration>currentPosition+5000) {
//当前位置添加五秒钟
player.seekTo(currentPosition+5000);
} else {
Toast.makeText(MediaDemoActivity.this, "大于总长度了", Toast.LENGTH_SHORT).show();
}
}

private void backPlay() {
//回退5秒钟
//先获取当前播放的位置
int currentPosition=player.getCurrentPosition();
//当前位置减少五秒钟小于0
if(currentPosition-5000>0) {
//当前位置减少五秒钟
player.seekTo(currentPosition - 5000);
} else {
Toast.makeText(MediaDemoActivity.this, "小于0秒钟", Toast.LENGTH_SHORT).show();
}
}

@Override
public void onClick(View v) {             //给三个按钮添加点击事件
switch (v.getId()) {

case R.id.back:
backPlay();
break;


case R.id.play:        
play();
break;


case R.id.to:
toPlay();
break;
}
}

部分布局代码:

<EditText
android:id="@+id/music"
android:visibility="gone"
android:textSize="18sp"
android:textColor="@android:color/black"
android:text="http://yinyueshiting.baidu.com/data2/music/238976199/238976199.mp3?xcode=e33e916dd8159c6523407a79428c3f0f"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

//滚动条布局
<SeekBar
android:id="@+id/seekBar"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

//播放界面布局
<LinearLayout
android:layout_below="@+id/seekBar"
android:layout_marginTop="20dp"
android:orientation="horizontal"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageButton
android:id="@+id/back"
android:src="@mipmap/a8v"
android:background="@null"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ImageButton
android:id="@+id/play"
android:src="@mipmap/a8q"
android:background="@null"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ImageButton
android:id="@+id/to"
android:src="@mipmap/a8m"
android:background="@null"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>

 

希望对大家能有所帮助!

 

posted on 2016-12-13 14:35  薄凉京  阅读(163)  评论(0编辑  收藏  举报

导航