在下文中我们实现的简单的音乐播放功能。

原创:Android应用开发记录-Andorid歌词秀(2)先来一个音频播放器

但是这样的方式在程序退出后播放也会停止,为了解决这个问题,使用的Service类。

在参考网上播放器例子代码的基础上,运用Proxy模式简化的Service的管理和使用。

功能简介:

1.选择手机上的音频,以list形式表示。

2.点击对应标题播放歌曲。

3.点击播放中的歌曲时,暂停播放,再次点击,继续播放。

工程,源码下载地址:http://download.csdn.net/source/3527938

简单说明

MusicPlaybackService 类

管理MediaPlayer 的生成和创建

实现了Resume功能

播放文件名的设定和取得功能

public class MusicPlaybackService extends Service {
    private MediaPlayer mMediaPlayer = new MediaPlayer();
    private final IBinder mBinder =  new  LocalBinder();
    private int mPausePosition = 0;
    private String mDataSource;
   
    public class LocalBinder extends Binder {  
        public MusicPlaybackService getService() {  
            return MusicPlaybackService.this ;  
        }  
    }

@Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }
   
    @Override
    public void onCreate() {
        mMediaPlayer = new MediaPlayer();
        super.onCreate();
    }

@Override
    public void onDestroy() {
        mMediaPlayer.release();
        mMediaPlayer = null;
        super.onDestroy();
    }

public void setDataSource(String path) { 
        mDataSource = path;
        try{  
            mMediaPlayer.reset();  
            mMediaPlayer.setDataSource(path);  
            mMediaPlayer.prepare();  
        }catch(IOException e) {  
            return;  
        } catch  (IllegalArgumentException e) {  
            return;  
        }  
    }
   
    public String getDataSource(){
        return mDataSource;
    }
   
    public void start() {
        mMediaPlayer.start();  
    }  
   
    public void stop() {  
        mMediaPlayer.stop();  
    }  
   
    public void pause() {
        mPausePosition = getPosition();
        mMediaPlayer.pause();  
    }
   
    public void resume() {  
        seek(mPausePosition);
        mMediaPlayer.start();
    }
   
    public boolean isPlaying() {  
        return mMediaPlayer.isPlaying();  
    }  
   
    public int getDuration() {  
        return mMediaPlayer.getDuration();  
    }  
      
    public int getPosition() {  
        return mMediaPlayer.getCurrentPosition();  
    }  
   
    public long seek(long whereto) {  
        mMediaPlayer.seekTo((int ) whereto);  
        return  whereto;  
    }  
}

Service类完成以后,就可以使用的,只是还有点繁琐,能不能包装一下呢?在这个程序中为了简化Service的利用,追加了一个MusicPlaybackServiceProxy类

主要是封装的ServiceConnection关联部分。虽然mPlaybackService 是在绑定后(实际上还要晚一点)才可用的,但是MusicPlaybackServiceProxy随时可用。

代码其实很简单,一看就应该能理解。

public class MusicPlaybackServiceProxy {
    private ContextWrapper mContextWrapper= null;
    private MusicPlaybackService mPlaybackService =  null ;
   
    private ServiceConnection mPlaybackConnection = new ServiceConnection() {  
           public void onServiceConnected(ComponentName className, IBinder service) {    
               mPlaybackService = ((MusicPlaybackService.LocalBinder)service).getService();
           }
 
           public void onServiceDisconnected(ComponentName className) {  
               mPlaybackService = null ; 
           }  
    }; 
   
    MusicPlaybackServiceProxy(ContextWrapper cw){
        mContextWrapper = cw;
    }
   
    void startAndBindService(){
        mContextWrapper.startService(new Intent(mContextWrapper ,MusicPlaybackService.class));          
        mContextWrapper.bindService(new Intent(mContextWrapper, MusicPlaybackService.class), mPlaybackConnection, Context.BIND_AUTO_CREATE);
    }
   
    void stopService(){
        if(mPlaybackService != null){
            mContextWrapper.stopService(new Intent(mContextWrapper ,MusicPlaybackService.class));
        }
    }
   
    public void setDataSource(String path) {  
        mPlaybackService.setDataSource(path);
    }
   
    public String getDataSource(){
        if(mPlaybackService != null){
            return mPlaybackService.getDataSource();
        }else{
            return null;
        }
    }
   
    public void start() {
        if(mPlaybackService != null){
            mPlaybackService.start();
        }
    }  
   
    public void stop(){
        if(mPlaybackService != null){
            mPlaybackService.stop();
        }
    }  
   
    public void pause() {
        if(mPlaybackService != null){
            mPlaybackService.pause();
        }
    }
   
    public void resume() {
        if(mPlaybackService != null){
            mPlaybackService.start();
        }
    }
   
    public boolean isPlaying() {
        if(mPlaybackService != null){
            return mPlaybackService.isPlaying();
        }else{
            return false;
        }
    }  
   
    public int getDuration() {
        if(mPlaybackService != null){
            return mPlaybackService.getDuration();
        }else{
            return 0;
        }
    }  
      
    public int getPosition() {
        if(mPlaybackService != null){
            return mPlaybackService.getPosition();
        }else{
            return 0;
        }
    }  
   
    public long seek(long whereto) {
        if(mPlaybackService != null){
            return mPlaybackService.seek(whereto);
        }else{
            return 0;
        }
    }

};

最后是使用代码的例子,更简单。

public class SubtitleMain extends Activity{
    private Cursor mCursor; 
    private ListView mFilelist;
    private MusicPlaybackServiceProxy mProxy = new MusicPlaybackServiceProxy(this);
   
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
     
        mProxy.startAndBindService();
       
        mCursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,  null ,
                 null ,null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
        //初始化歌曲列表
        mFilelist = (ListView)findViewById(R.id.audio_file_view);
              
        startManagingCursor(mCursor);
       
        String[] from = new String[] {MediaStore.Audio.Media.TITLE};
        int[] to = new int[]{R.id.music_title};
       
        SimpleCursorAdapter adapter =
            new SimpleCursorAdapter(this,R.layout.file_list_row, mCursor, from ,to);
       
        mFilelist.setAdapter(adapter);
        mFilelist.setOnItemClickListener(new OnItemClickListener(){
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                mCursor.moveToPosition(position);
                String url = mCursor.getString(mCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
                String urlPlaying = mProxy.getDataSource();
               
                if(urlPlaying == null || url.compareTo(urlPlaying)!=0){
                    //如果是第一次播放或不是同一首歌
                    mProxy.setDataSource(url);  
                    mProxy.start();
                }else{
                    if(mProxy.isPlaying()){
                        mProxy.pause();
                    }else{
                        mProxy.resume();
                    }
                }
            }
        });
    }

@Override
    protected void onPause() {
        if(!mProxy.isPlaying()){
            mProxy.stopService();
        }
        super.onPause();
    }
}

原创:Android应用开发记录-Andorid歌词秀(3)使用的Service的音频播放器相关推荐

  1. 原创:Android应用开发记录-Andorid歌词秀(4)完成,含源码

    最新版软件请参照: Android应用开发记录-字幕播放器(5)完善 功能简介: 1.自动读取与音乐相同位置的歌词文件 2.根据播放进度,表示当前的歌词 3.按歌词语句快进,快退. 可以用来记歌词,学 ...

  2. 原创:Android应用开发记录-Andorid歌词秀(1)想法

    现在有好多外语资源都带有字幕信息,就是那个LRC文件,内容大致如此 [00:23.49]我越慌张却越灿烂 [00:28.65]倒退着跑到了前方 [00:34.89]怎么忽然就成了这样 [00:41.1 ...

  3. Android应用开发记录-Android歌词秀(5)完善一下,像一个产品了

    原创:Android应用开发记录-Andorid歌词秀(4)完成,含源码中的播放器虽然实现了播放,歌词移动等功能,但是距离真正产品级的软件还有一段距离,为此进行了完善 增加的主要功能 1.将操作按钮改 ...

  4. 【创新项目实训】Android移动开发教学app案例之音频播放器(二)

    教学app案例之音频播放器(二) 一.开发环境 二.项目介绍 三.开始主界面 四.显示歌曲列表 五.播放音乐的服务 六.实现播放音乐 一.开发环境 软件环境: Android Studio 4.1.3 ...

  5. Android SELinux开发入门指南之如何增加Native Binder Service权限

      Android SELinux开发入门指南之如何增加Native Binder Service权限 Android SELinux开发多场景实战指南目录: Android SELinux开发入门指 ...

  6. Android SELinux开发入门指南之如何增加Java Binder Service权限

      Android SELinux开发入门指南之如何增加Java Binder Service权限 Android SELinux开发多场景实战指南目录: Android SELinux开发入门指南之 ...

  7. Android 使用 MediaCodec API音频播放器

    OpenMAX 有时缩写为"OMX",是针对多媒体处理的免版税.跨平台的例程和接口集.它主要用于嵌入式设备,在设计时考虑了效率,因此可以以优化和受控的方式处理大量多媒体数据,包括视 ...

  8. 网页版音频播放器,歌词随音乐而动

    制作不易,多多支持,谢谢!! 我的博客里面还有关于视频播放器的,感兴趣的小伙伴可以来看看. 这个是效果图 这是利用audio做的一个歌词随音乐而动的html页面. 这个简单的音频播放器是用ajax请求 ...

  9. android服务绑定音乐播放器,Android基于Service的音乐播放器

    本文开发一个基于Service的音乐播放器,音乐由后台运行的Service负责播放,当后台的播放状态发生变化时,程序将会通过发送广播通知前台Activity更新界面:当点击Activity的界面按钮时 ...

最新文章

  1. 推荐7款实用强大的神器工具,建议你先收藏,总有一天你会用到!
  2. 人体上身各部位图_【肝货】画好人体结构,你还需要了解这些
  3. Android中开发习惯
  4. 致新手——OpenStack云倒底是什么?
  5. Docker教程-深度学习环境配置
  6. java –cp ./:_成为Java流大师–第3部分:终端操作
  7. ZK的实际应用:MVVM –加载和渲染数据
  8. Ubuntu ufw 取消 网关到 224.0.0.1 multicast 日志
  9. 基于能量均衡高效WSN的LEACH协议改进算法
  10. Unity 2D人物移动实现
  11. VBA控制Excel行列转换
  12. (转)移动端自适应方案
  13. 接口测试+自动化接口测试详解入门到精通
  14. Unified diagnostic services (UDS)
  15. firebox插件制作
  16. Javaweb学习第三天,CSS(知识点来自广陵散老师总结)
  17. 关于“存储空间不足”的问题
  18. Java+spring+springmvc ssm432咖啡馆咖啡销售预定管理系统#毕业设计
  19. 计算机组成原理——8086 CPU寄存器
  20. Vanish CDN

热门文章

  1. 正弦函数的频谱图(FFT)
  2. SpringBoot整合RabbitMQ之 典型应用场景实战一
  3. U盘在微型计算机属于什么,u盘属于什么类目
  4. c语言是否所有的字符串都有终止符,C语言字符串数组
  5. 中国青年报:“区块链+供应链金融”为小微企业融资推开一扇窗
  6. 软件外包接单经验谈-估算工期、报价、签订合同篇
  7. 雕爷:我眼中的O2O成长路径
  8. python文章抄袭检测_怎样用Python检测抄袭行为?广大中小学生们的美梦就此结束...
  9. ajax使用 ajax+json
  10. 新东方回应员工吐槽歌曲走红:我们初心不变 未来可期