创建Music播放器demo
来源:互联网 发布:淘宝卖家怎么退货退款 编辑:程序博客网 时间:2024/05/18 01:23
- 在res目录下创建一个raw目录
- raw目录是android中唯一不会自动创建的目录
- 存放的是android无法自动识别的文件
MediaPlayer
创建MeidiaPlayer
- 调用reset方法,初始化MediaPlayer(调与不调没区别)
- 读取音乐文件
//最原始的方式获取文件Resources resources = getResources();AssetFileDescriptor assetFileDesc = resources.openRawResourceFd(R.raw.zxsd);FileDescriptor fileDesc = assetFileDesc.getFileDescriptor();//优化:通过文件描述符设置数据源player.setDataSource("http://qzone.haoduoge.com/music2/2014-10-30/1414658946.mp3");
- 准备: 加载数据
player.prepare();
- 启动
player.start();
- 每次退出后要销毁此进程(onDestroy方法)
@Override
public void onDestroy() {
player.stop();//停止
player.release();//释放资源
super.onDestroy();
} 设置开始与结束按钮
@Overridepublic void start(){ player.start();}@Overridepublic void stop(){ player.stop();}
设置单曲循环
public void loop(){ player.setLooping(true);}
- 防止ANR异常(阻塞主线程) 使用异步:
player.perpareAsync();
正在准备中(Preparing)走到准备中(Prepared):需要设置个监听器
player.setOnPreparedListener(new OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { //如果这个方法调用,则代表准备完成 Toast.makeText(getApplicationContext(), "准备完成",Toast.LENGTH_LONG).show(); }});`
设置错误监听
`player.setOnErrorListener(new OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { Toast.makeText(getApplicationContext(), "发生了错误", Toast.LENGTH_LONG).show(); return false; } });`
完整的回调:
player.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
isPlaying = false;
//完成的回调
Toast.makeText(getApplicationContext(), "播放完成", Toast.LENGTH_SHORT).show();
}
});
- 如果只在主线程中运行代码,那么一back,则会杀掉进程,so要放在一个Service中:
private MediaPlayer player;//定义成成员方法 @Override public void onCreate() { super.onCreate(); player = new MediaPlayer(); //player.reset(); Resources resources = getResources();AssetFileDescriptor assetFileDesc = resources.openRawResourceFd(R.raw.zxsd);FileDescriptor fileDesc = assetFileDesc.getFileDescriptor();try{ //通过文件描述符设置数据源 player.setDataSource(fileDesc); player.setOnPerparedListener(new OnPerparedListener() { @Override public void onPerpared(MediaPlayer mp) { //如果这个方法调用,则代表准备完成 Toast.makeText(getApplicationContext(),"准备完成",Toast.LENGTH_LONG).show(); } });}//设置错误监听 player.setOnErrorListener(new OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { Toast.makeText(getApplicationContext(), "发生了错误", Toast.LENGTH_LONG).show(); return false; } });player.setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { isPlaying = false; //完成的回调 Toast.makeText(getApplicationContext(), "播放完成", Toast.LENGTH_SHORT).show(); } }); //准备: 加载数据// player.prepare(); //异步准备 } catch (IOException e) { e.printStackTrace(); }public void onStartClick(View view){ player.start();}public void onStopClick(View view){ player.stop();}@Override public void onDestroy() { player.stop(); player.release(); super.onDestroy(); }
在清单文件中注册一下此Service:
<service android:name="com.example.music.MusicService"/>
把操作写在了Sverice中,那么在Activity中则完全无法访问,so要与之绑定:
//此为Service中方法 public void start() { player.start(); } public void stop() { player.stop(); }
- 在Activity中调用:
public void onStartClick(View view){ //调用service方法启动音乐}public void onStopClick(View view){ //调用service方法暂停音乐}
- 与之绑定:
//混合启动Intent intent = new Intent(this,MusicService.class);startService(intent);//先把Service启动 conn = new Conn();//conn定义成成员变量 bindService(intent, conn, BIND_AUTO_CREATE);//定义一个内部Conntion类class Conn implements ServiceConnection{ @Override public void onServiceConnected(ComponentName name, IBinder service) { } @Override public void onServiceDisconnected(ComponentName name) { }}//在销毁的时候,那么conn应该也随之销毁@Overrideprotected void onDestroy() { unbindService(conn); super.onDestroy();}
- 但是,并不是所有的方法都要对外暴露,so定义一个接口,由MyBinder实现:
package com.example.music;public interface MusicController { public void start(); public void stop();}
- 如果与之绑定,则要返回一个IBinder对象
class MyBinder extends Binder implements MusicController{ @Override public void start() { MusicService.this.start(); } @Override public void stop() { MusicService.this.stop(); }}
- 定义好的controller接口为空,so直接把binder对象强转:
class Conn implements ServiceConnection{ @Override public void onServiceConnected(ComponentName name, IBinder service) { controller = (MusicController)service; } @Override public void onServiceDisconnected(ComponentName name) { }}
- 现在可以在开始/暂停button中调用此方法:
public void onStartClick(View view) { //调用Service的方法启动音乐 controller.start(); } public void onStopClick(View view) { //调用Service的方法停止音乐 controller.stop(); }
- 由于是在进程中绑定的,那么则会在后台运行,如果再次打开Activity。那么则会发生错误,so把prepareAsync写在start中,由于该方法为异步,则把start写在回调方法中:
public void start(){ player.prepareAsync();}@Overridepublic void onPrepared(MediaPlayer mp) { //如果这个方法调用,则代表准备完成 Toast.makeText(getApplicationContext(), "准备完成", Toast.LENGTH_LONG).show(); player.start();}
- 创建一个进度条(ProgressBar),but现在使用ProgressBar的子类SeekBar(拖拉条?)
<SeekBar android:id="@+id/seekbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="15dp" android:max="1000" />
- 在Activity中调用SeekBar:
private SeekBar seekbar;seekbar = (SeekBar) this.findViewById(R.id.seekbar);
0 0
- 创建Music播放器demo
- 与系统music同步播放器Demo
- 我的个人Music播放器
- html5写的music播放器
- android源码解析------Music 音乐播放器
- 源码 Music音乐播放器代码结构
- 后台播放music示例
- Android中music播放器源码要点详解【安卓music源码进化一】
- Android中music播放器源码要点详解【安卓music源码进化一】
- RTSP 播放器 demo
- 剖析Android自带Widget-Music播放器
- Android实战 - 音心播放器 (Music Service 实现)
- 享听音乐播放器(Enjoy listening to music player)
- 基于service服务后台运行的music播放器
- 播放音乐:pygame.mixer.music
- Android自带Music播放器更新播放时间和进度条的方法
- android music暂停或停止其他音乐播放器的播放
- Android音乐播放器demo
- [4]AMQP(高级消息队列协议) ----改造QPID JMS-0.9 API 对 SSLContext的 支持
- JS如何判断滚动条是否滚到底部
- js获取页面及个元素高度、宽度
- UIAlertController在Swift中的用法
- 利用githubpages创建你的个人博客
- 创建Music播放器demo
- 关于把文本文件复制到excel中如何能够自动排列好的问题
- C++ vector 和map
- Coursera公开课笔记: 斯坦福大学机器学习第七课“正则化”
- Swift实战——模板模式
- 如何把excel中一个单元格内容转换到多个单元格当中
- 开始记录学习计划
- LeetCode - 148. Sort List
- oracle的存储过程