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);
}
}
}
}