当前位置:操作系统 > 安卓/Android >>

Android歌词秀设计思路(3)通用的音乐播放服务(上)

MediaPlayerService作为通用的音乐播放Service类,它的功能有:
控制音乐播放,停止,暂停,前/后歌曲切换。
Audio Focus相关处理(对应应用程序切换)。
Intent处理(对应多媒体键,耳机线拔出,打入电话)
Notification处理
其实这个类本来是和LyricPlayerService在一起的,但是随着功能的增加代码越来越乱。于是就有了分开的想法。但是分也要分出点名堂,于是为这个类定义的功能就是实现一个通用的媒体播放服务。
分开后的类关系可以从下面的全体图中看出。

下面针对各功能加以说明
控制音乐播放,停止,暂停,前/后歌曲切换。
在开始真正的工作之前要解决的一个问题是:作为通用的音乐播放那个服务,就一定会还有在后台时播放前/后一首歌的要求。但是这是应用已经不存在了,不可能把这个任务交个Activie来处理。为了解决这个问题定义了一个用于取得相应的媒体文件信息的MediaInfoProvider类。
public interface MediaInfoProvider{ 
    String getUrl(); 
    String getTitle(); 
    boolean moveToNext(); 
    boolean moveToPrev(); 
}
通过调用moveToNext和moveToPrev方法实现媒体文件的切换,然后通过调用getUrl和getTitle来取得文件的信息。
注意在这里只是规定接口,真正的实例必须由利用者通过下面的方法来提供。有一点额外的工作就是如果希望播放的歌曲和正在播放的不一样的话就先停止正在播放的歌曲。
public void setMediaInfoProvider(MediaInfoProvider provider) {   
    if( mDataSource != provider.getUrl() && (isStop() == false)){ 
        stop(); 
    } 
    mMediaInfoProvider = provider; 
    mDataSource = provider.getUrl(); 
    mTitle = provider.getTitle(); 

当然在利用MediaPlayer之前我们需要onCreate方法中进行一些准备工作。内容包括
创建MediaPlayer对象,
设定唤醒方式(目的是防止播放中CPU进入休眠状态,记得在 AndroidManifest.xml中设定权限为android.permission.WAKE_LOCK)
指定播放完了后的监听器。
mMediaPlayer = new MediaPlayer(); 
mMediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK); 
mMediaPlayer.setOnCompletionListener(this);
 
这个播放完了监听器的目的有两个。一个是停止任务栏上的图标显示,另外一个是在没有前台应用的时候自动关闭本服务。要是没有人管了怎么办?对吧。
@Override
    public void onCompletion(MediaPlayer mp) { 
        mIsPausing = false; 
        mNotificationManager.cancel(NOTIFICATION); 
        if(mBinded == false){ 
            stopSelf(); 
        } 
    }  
然后就是onDestroy中进行适当的收尾工作。其中停止播放的部分看起来好像没有也可以,还是一切都按部就班好一些吧。
mMediaPlayer.setOnCompletionListener(null); 
if(!isStop()){ 
    stop(); 

mMediaPlayer.release(); 
mMediaPlayer = null;
 终于到到了真正的控制部分。接下来的程序比较长但内容确实比较简单。
在最前面的start方法比较复杂,主要是因为虽然说起来都是播放,但是从暂停恢复播放和播放新歌的处理有所不同。其他的没有什么好讲的。
public void start() { 
        tryToGetAudioFocus(); 
        if(!isPausing()){ 
            if(isPlaying()){ 
                stop(); 
            } 
            try{    
                mMediaPlayer.reset();    
                mMediaPlayer.setDataSource(mDataSource);    
                mMediaPlayer.prepare();  
            }catch(IOException e) {    
                return;    
            } catch  (IllegalArgumentException e) {    
                return;    
            }    
            mMediaPlayer.start(); 
        }else{ 
            mIsPausing = false; 
            mMediaPlayer.start(); 
        } 
        showNotification(); 
    }    
     
    public void stop() { 
        giveUpAudioFocus(); 
        mMediaPlayer.stop();   
        mIsPausing = false; 
        mNotificationManager.cancel(NOTIFICATION); 
    }    
     
    public void pause() { 
        giveUpAudioFocus(); 
        mIsPausing = true; 
        mMediaPlayer.pause(); 
    } 
     
    public void playNext(){ 
        if(mMediaInfoProvider.moveToNext()){ 
            if(isPlaying() || isPausing()){ 
                stop(); 
            } 
            mDataSource = mMediaInfoProvider.getUrl(); 
            mTitle = mMediaInfoProvider.getTitle(); 
            start(); 
        } 
    } 
     
    public void playPrev(){ 
        if(mMediaInfoProvider.moveToPrev()){ 
            if(isPlaying() || isPausing()){ 
                stop(); 
  &n

补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,