android音乐后台播放需要用到Service

package com.taiyi.DynamicOffice.other.service;

import java.io.File;
import java.io.IOException;

import com.taiyi.DynamicOffice.R;
import com.taiyi.DynamicOffice.other.activity.ResourceActivity;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnErrorListener;
import android.os.Handler;
import android.os.IBinder;

public class MusicService extends Service
{
 public static MediaPlayer mediaPlayer = new MediaPlayer();
 public static int flag = 0;
 // public static File mo_curPath = new File(FileUtil.getExternalPath());
 // public static File[] mo_fileList = null;
 public static String musicname = "";
 public static String musicPath = "";
 public static int mCurrent = 0;
 public static int player_state = 0;

 // 定义Handler对象
 Handler handler = null;

 @Override
 public IBinder onBind(Intent arg0)
 {
  // TODO Auto-generated method stub
  return null;
 }

 @Override
 public void onCreate()
 {
  // TODO Auto-generated method stub
  super.onCreate();
  handler = new Handler();

 }

 @Override
 public void onStart(Intent intent, int startId)
 {
  // TODO Auto-generated method stub
  super.onStart(intent, startId);
  handler.post(updatepPaly); // Handler将线程马上加入到线程队列去,没有延时

 }

 public void onDestroy()
 {
  // 不需要后台播放时,将这个线程从线程队列中去掉,不会再执行

  super.onDestroy();
  handler.removeCallbacks(updatepPaly);
  // PlayerControl.stop();
 }

 Runnable updatepPaly = new Runnable()
 {

  // 匿名内部类方式,实现run()方法
  public void run()
  {

   if (flag == 1)
   { // 点击了List列表中的歌曲时播放相应歌曲,并开始同步歌词、进度条
    refreshView();
    MusicPlayer();
    ResourceActivity.duration.post(ResourceActivity.updatesb);
    flag = 0;

   }
   else if (flag == 2)
   { // 开始/暂停

    MusicPlayer();
    refreshView();
    ResourceActivity.duration.post(ResourceActivity.updatesb);
    flag = 0;

   }
   else if (flag == 3)
   { // 下一首

    MusicNext();
    refreshView();
    ResourceActivity.duration.post(ResourceActivity.updatesb);
    flag = 0;

   }
   else if (flag == 4)
   { // 上一首

    MusicBack();
    refreshView();
    ResourceActivity.duration.post(ResourceActivity.updatesb);
    flag = 0;

   }
   // ===============设置一首歌播放完成监听事件(每播放一首歌曲都会执行这个函数)=====================
   mediaPlayer.setOnCompletionListener(new OnCompletionListener()
   {

    public void onCompletion(MediaPlayer mp)
    {
     MusicNext();
     ResourceActivity.duration.post(ResourceActivity.updatesb);
    }
   });
   handler.postDelayed(updatepPaly, 2000); // 隔3000毫秒就将updateThread这个线程加入到线程队列去
  } // (刚开始运行时是在onStart将这个线程加入到消息队列的)
 };

 public static void MusicPlayer()
 {
  // musicname = ResourceActivity.mo_fileList[mCurrent].getName();
  // ResourceActivity.tv_musicname.setText(musicname);
  // musicPath = ResourceActivity.mo_fileList[mCurrent].getPath();
  // if (player_state == 0)
  // {
  if (mediaPlayer.isPlaying())
  {
   player_state = 1;
   ResourceActivity.btnplay.setImageResource(R.drawable.isplaying);
   mediaPlayer.pause();
  }
  try
  {
   mediaPlayer.reset();
   mediaPlayer.setDataSource(musicPath);
   mediaPlayer.prepare();
   mediaPlayer.start();
   ResourceActivity.btnplay.setImageResource(R.drawable.pause1);
  }
  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();
  }
  mediaPlayer.setOnCompletionListener(new OnCompletionListener()
  {

   @Override
   public void onCompletion(MediaPlayer mp)
   {
    // TODO Auto-generated method stub
    MusicNext();
   }

  });
  mediaPlayer.setOnErrorListener(new OnErrorListener()
  {

   @Override
   public boolean onError(MediaPlayer mp, int what, int extra)
   {
    mediaPlayer.reset();
    return true;
   }

  });
  // }
  ResourceActivity.duration.post(ResourceActivity.updatesb);
 }

 /**
  * 上一首
  */
 public static void MusicBack()
 {
  if (mCurrent == 0)
  {
   mCurrent = ResourceActivity.mo_fileList.length - 1;

  }
  else if (mCurrent > 0)
  {
//   musicPath = ResourceActivity.mo_fileList[ResourceActivity.mCurrent-1].getPath();
//   musicname = ResourceActivity.mo_fileList[ResourceActivity.mCurrent-1].getName();
   --mCurrent;
  }
  mediaPlayer.stop();
  refreshView();
  MusicPlayer();
 }

 /**
  * 下一首
  */
 public static void MusicNext()
 {
  if (ResourceActivity.mo_fileList.length == 1)
  {
   MusicPlayer();
   return;

  }
  else if (mCurrent == ResourceActivity.mo_fileList.length - 1)
  {
   mCurrent = 0;
  }
  else if (mCurrent < ResourceActivity.mo_fileList.length - 1)
  {
//   musicPath = ResourceActivity.mo_fileList[ResourceActivity.mCurrent+1].getPath();
//   musicname = ResourceActivity.mo_fileList[ResourceActivity.mCurrent+1].getName();
   mCurrent++;
  }
  mediaPlayer.stop();
  refreshView();
  MusicPlayer();
 }

 /**
  * 刷新控件
  */
 public static void refreshView()
 {
  musicPath = ResourceActivity.mo_fileList[mCurrent].getPath();
  musicname = ResourceActivity.mo_fileList[mCurrent].getName();
  ResourceActivity.tv_musicname.setText(musicname);
  ResourceActivity.duration.post(ResourceActivity.updatesb);
 }
}

ResourceActivity.java

 public static Runnable updatesb = new Runnable()
 {

  public void run()
  {

   // 显示当前播放时间、歌曲总时间长度、当前歌曲位置、总歌曲数
   // SetSongTime();
   int _current = MusicService.mediaPlayer.getCurrentPosition();
   maxduration = MusicService.mediaPlayer.getDuration();
   duration.setMax(maxduration);
   duration.setProgress(_current);
   duration.postDelayed(updatesb, 1000);
   // 更新SeekBar进度条
   // SetSeekBar();
   // 同步更新歌词
   // SetLrc();
   // 播放下一首时,更新滚动的文字
   // SetGDview();

   // 休眠(隔)50ms再次执行这个函数
   // seekBar.postDelayed(updatesb, 1000);
  }
 };

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值