博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MediaPlayer简易应用
阅读量:4357 次
发布时间:2019-06-07

本文共 7457 字,大约阅读时间需要 24 分钟。

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

 

第一部分:滚动条的实现(此处用的是安卓自带的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>

 

希望对大家能有所帮助!

 

转载于:https://www.cnblogs.com/BLJworld1994/p/6169831.html

你可能感兴趣的文章
C++学习笔记(七)——函数缺省参数值
查看>>
UVA - 10003 Cutting Sticks
查看>>
JS 弹出网页 (不显示地址栏,工具栏) 网页去掉地址栏
查看>>
使用update包更新系统文件的过程
查看>>
js高级程序设计--DOM
查看>>
异步JS:$.Deferred的使用
查看>>
Angular Material 教程之布局篇
查看>>
正则表达式
查看>>
ASP里面eof、bof都是什么意思?
查看>>
Golang学习 - path/filepath 包
查看>>
java序列化和反序列化
查看>>
【转】Eclipse和PyDev搭建完美Python开发环境(Ubuntu篇)
查看>>
redis安装和配置
查看>>
2016424王启元 Exp5 msf基础应用
查看>>
android + eclipse + 后台静默安装(一看就会)
查看>>
JPA事务总结
查看>>
transitionFromView方法的使用
查看>>
ubuntu nginx+php环境520错误
查看>>
Java中OutOfMemoryError(内存溢出)的三种情况及解决办法
查看>>
windows 10 无法使用内置管理员账户打开应用的解决方案
查看>>