播放器代码片段

package com.magicy.repeatbutton;

import java.io.IOException;

import android.app.Service;
import android.content.Intent;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaRecorder.AudioSource;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
import android.os.Message;
import android.provider.MediaStore.Audio;
import android.widget.MediaController.MediaPlayerControl;

public class MediaPlaybackService extends Service {

 static public final String TAG = "MediaPlaybackService";
 
 static public final int MSG_MAIN_REPORTERROR  = 0x01;
 
 private Handler mMainHandler = new Handler(){
  
  public void handleMessage(Message msg){
   
   switch(msg.what){
   
   case MSG_MAIN_REPORTERROR:{
    // report error.
   }
   break;
   
   default:
    break;
   }
   
  }
 };
 
 
 
 /*工作线程*/
 private HandlerThread mWorkThread = null;
 private Handler   mWorkHandler = null;
 
 // 定义子线程需要响应的消息
 
 @Override
 public void onCreate() {
  // TODO Auto-generated method stub
  super.onCreate();
  
  if(mWorkThread == null){
   mWorkThread = new HandlerThread("MusicWorker");
   mWorkThread.start();
  }
  
  if(mWorkHandler == null){
   mWorkHandler = new Handler(mWorkThread.getLooper()){
    public void handleMessage(Message msg){
     // 处理子线程的消息,这里处理耗时操作。对外接口在这里实际实现。
     // 所有的工作都发送消息在这里串化
     //1. 更新播放列表
     //2. 播放指定曲目
     //3. 播放
     //4. 暂停
     //5. 上一曲
     //6. 下一曲
     //7. 获取当前位置
     //8. 获取持续时间
     //9. 跳转到指定位置
     //10. 开机保持
     //11. Widget进入
     //12. 设置播放模式  (全部循环/随机播放/单曲循环)
     //13. 获取播放模式
     
    }
   };
  }
 }
 
 @Override
 public IBinder onBind(Intent arg0) {
  // TODO Auto-generated method stub
  return null;
 }
 
 @Override
 public boolean onUnbind(Intent intent) {
  // TODO Auto-generated method stub
  return super.onUnbind(intent);
 }
 
 private class MusicPlayer implements MediaPlayer.OnCompletionListener,
     MediaPlayer.OnErrorListener, MediaPlayer.OnPreparedListener,
     AudioManager.OnAudioFocusChangeListener{
  
  private    MediaPlayer mPlayer = new MediaPlayer();
  private    boolean mInitSucced = false;
  private    boolean  mPlayBeforeLossFocus = false;
  private    AudioManager mAudioManager = null;

  @Override
  public void onPrepared(MediaPlayer mp) {
   // TODO Auto-generated method stub
   // current not using.
   
  }

  @Override
  public boolean onError(MediaPlayer mp, int what, int extra) {
   // TODO Auto-generated method stub
   // 让主线程报错,然后让子线程播放下一首
   return false;
  }

  @Override
  public void onCompletion(MediaPlayer mp) {
   // TODO Auto-generated method stub
   // 通知子线程播放下一曲
   
  }
  
  @Override
  public void onAudioFocusChange(int focusChange) {
   // TODO Auto-generated method stub
   
   switch(focusChange){
   
    case AudioManager.AUDIOFOCUS_GAIN:{
     
     if(mPlayBeforeLossFocus){
      play();
     }
    }
    break;
    
    case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
    case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:{
    
     if(mPlayer != null){
      mPlayBeforeLossFocus = isPlaying();
     }
     
     if(mPlayBeforeLossFocus){
      pause(); // 暂停
     }
    }
    break;
    
    case AudioManager.AUDIOFOCUS_LOSS:{
     stop();
     if(mAudioManager != null){
      mAudioManager.abandonAudioFocus(this);
     }
    }
    break;
    
    default:
     break;
   }
   
  }
  
  public MusicPlayer(){
   
   mAudioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
   if(mPlayer == null){
    mPlayer = new MediaPlayer();
   }
  }
  
  
  //1. 设置播放文件
  public boolean setDataSourceSync(String filePath){
   mInitSucced = false;
   
   if(mPlayer != null && filePath != null){
    
    try {
     mPlayer.reset();
     mPlayer.setDataSource(filePath);
     mPlayer.prepare();
     mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
     mPlayer.setOnErrorListener(this);
     mPlayer.setOnCompletionListener(this);
     mInitSucced = true;
     //mPlayer.setOnPreparedListener(this); // 同步接口不需要调用
    } catch (IllegalArgumentException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    } catch (IllegalStateException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
    
   }
   
   return mInitSucced;
  }
  //2. 播放
  public boolean play(){
   
   boolean ret = false;
   if(mPlayer != null && mInitSucced){
    AudioManager am = (AudioManager) getSystemService(AUDIO_SERVICE);
    if(am != null){
     am.requestAudioFocus(this, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
    }
    mPlayer.start();
    
   }
   
   return ret;
  }


  //3. 暂停
  public void pause(){
   
   if(mPlayer != null && mInitSucced){
    mPlayer.pause();
   }
  }
  
  //4. 是否播放中
  public boolean isPlaying(){
   
   if(mPlayer != null && mInitSucced){
    return mPlayer.isPlaying();
   }
   
   return false;
  }
  
  //5. 跳转
  public void seekTo(int pos){
   
   if(mPlayer != null && mInitSucced){
    mPlayer.seekTo(pos);
   }
  }
  
  //6. 停止
  public void stop(){
   
   if(mPlayer != null && mInitSucced){
    mPlayer.stop();
   }
  }
  
  //7. 获取当前时间
  public int getPosition(){
   int pos = -1;
   if(mPlayer != null && mInitSucced){
    pos = mPlayer.getCurrentPosition();
   }
   return pos;
  }
  
  //8. 获取持续时间
  public int getDruation(){
   
   int druation = -1;
   if(mPlayer != null && mInitSucced){
    druation = mPlayer.getDuration();
   }
   return druation;
  }
  
  //9. 释放
  public void release(){
   
   if(mPlayer != null){
    mPlayer.release();
   }
   mPlayer = null;
   
   if(mAudioManager != null){
    mAudioManager.abandonAudioFocus(this);
   }
   
  }
  
  
  
 }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值