Android——简易音乐播放器
2016-03-20 22:05
501 查看
音乐播放器实现简单的音乐播放,进度条的拖动和能够后台播放。
由于需要实现后台播放,所以必须创建服务,在服务中实现音乐的播放,暂停,和进度条拖动改变音乐播放进度的方法。
MusicService
activity
MusicInterface
xml
由于需要实现后台播放,所以必须创建服务,在服务中实现音乐的播放,暂停,和进度条拖动改变音乐播放进度的方法。
MusicService
public class MusicServer extends Service { MediaPlayer player; private Timer timer; @Override public IBinder onBind(Intent intent) { return new MusicController(); } @Override public void onCreate() { super.onCreate(); //在服务创建时新建mediaplayer对象 player = new MediaPlayer(); } @Override public void onDestroy() { // 服务被关闭的时候 super.onDestroy(); //停止播放 player.stop(); //释放资源,此时player对象已经废掉了,要想再次播放必须新建mediaplayer对象 player.release(); player = null; if(timer != null){ timer.cancel(); timer = null; } } //中间人类,实现服务与activity的通信 class MusicController extends Binder implements MusicInterface{ @Override public void play() { MusicServer.this.play(); } @Override public void pause() { MusicServer.this.pause(); } @Override public void continuePlay() { MusicServer.this.continuePlay(); } @Override public void seekTo(int progress) { MusicServer.this.seekTo(progress); } } public void play(){ //重置 player.reset(); try { //加载多媒体文件, player.setDataSource("data/data/com.example.musicplay/cache/xiulianaiqing.mp3"); //准备播放 player.prepare(); //开始播放 player.start(); //不断监听播放进度,通知主线程刷新UI addTimer(); } catch (Exception e) { e.printStackTrace(); } } public void continuePlay(){ player.start(); } public void pause(){ player.pause(); } public void seekTo(int progress){ player.seekTo(progress); } public void addTimer(){ if(timer == null){ timer = new Timer(); } timer.schedule(new TimerTask() { @Override public void run() { //获取歌曲的总时长 int duration = player.getDuration(); //获取歌曲当前播放进度 int CurrentPosition = player.getCurrentPosition(); Message msg = MainActivity.handler.obtainMessage(); //把进度封装至消息对象中 Bundle bundle = new Bundle(); bundle.putInt("duration", duration); bundle.putInt("CurrentPosition", CurrentPosition); msg.setData(bundle); MainActivity.handler.sendMessage(msg); }//开始计时任务后的5毫秒第一次执行run方法,以后每1000毫秒执行一次 }, 5,1000); } }
activity
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); sb = (SeekBar) findViewById(R.id.sb); //设置进度条拖动监听事件 sb.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { //根据拖动的进度改变音乐播放的进度,停止时调用 int progress = seekBar.getProgress(); mi.seekTo(progress); } //开始拖的时候调用 @Override public void onStartTrackingTouch(SeekBar seekBar) { } //拖动过程中不断调用 @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { } }); //启动音乐服务 intent = new Intent(this,MusicServer.class); startService(intent); conn = new MyserviceConn(); //绑定服务,获取中间人对象,通过借口调用服务中的方法 bindService(intent, conn, BIND_AUTO_CREATE); } class MyserviceConn implements ServiceConnection{ //获得音乐服务的中间人对象,强制转换成接口对象 @Override public void onServiceConnected(ComponentName name, IBinder service) { mi = (MusicInterface) service; } @Override public void onServiceDisconnected(ComponentName name) { } } public void play(View v){ mi.play(); } public void continuePlay(View v){ mi.continuePlay(); } public void pause(View v){ mi.pause(); } public void exit(){ unbindService(conn); stopService(intent); } }
MusicInterface
public interface MusicInterface { void play(); void pause(); void continuePlay(); void seekTo(int progress); }
xml
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="开始播放" android:onClick="play"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="暂停播放" android:onClick="pause"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="继续播放" android:onClick="continuePlay"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="退出" android:onClick="exit"/> <SeekBar android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/sb"/>
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories