Service是一个生命周期长且没有用户界面的程序,当程序在各个activity中切换的时候,我们可以利用service来实现背景音乐的播放,即使当程序退出到后台的时候,音乐依然在播放。

实现代码如下:

(1)src/.../MainActivity.java

public class MainActivity extends Activity implements OnClickListener {private Button mBtnPrevious; // 上一首private Button mBtnPlay; // 播放private Button mBtnNext; // 下一首private Button mBtnPause; // 暂停private ComponentName component; // 用于启动服务public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 得到布局中的控件findView();// 绑定控件事件setListener();}// 得到布局中的控件private void findView() {component = new ComponentName(this, MusicService.class);mBtnPrevious = (Button) findViewById(R.id.previous);mBtnPlay = (Button) findViewById(R.id.play);mBtnNext = (Button) findViewById(R.id.next);mBtnPause = (Button) findViewById(R.id.pause);}// 绑定控件事件private void setListener() {mBtnPrevious.setOnClickListener(this);mBtnPlay.setOnClickListener(this);mBtnNext.setOnClickListener(this);mBtnPause.setOnClickListener(this);}// 按钮点击事件响应public void onClick(View v) {// 如果点击前一首歌,就在intent中传递前一首歌参数if (v == mBtnPrevious) {Intent mIntent = new Intent(MusicService.PREVIOUS_ACTION);mIntent.setComponent(component);startService(mIntent);// 如果点击前播放歌曲,就在intent中传递播放当前歌参数} else if (v == mBtnPlay) {Intent mIntent = new Intent(MusicService.PLAY_ACTION);mIntent.setComponent(component);startService(mIntent);// 如果点击前一首歌,就在intent中传递下一首歌参数} else if (v == mBtnNext) {Intent mIntent = new Intent(MusicService.NEXT_ACTION);mIntent.setComponent(component);startService(mIntent);// 如果点击前一首歌,就在intent中传递暂停首歌参数} else {Intent mIntent = new Intent(MusicService.PAUSE_ACTION);mIntent.setComponent(component);startService(mIntent);}}
}

(2)    src/.../ MusicService.java

public class MusicService extends Service {// 定义需要显示的音乐的字段String[] mCursorCols = new String[] {"audio._id AS _id", // index must match IDCOLIDX belowMediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.ALBUM,MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.DATA,MediaStore.Audio.Media.MIME_TYPE, MediaStore.Audio.Media.ALBUM_ID,MediaStore.Audio.Media.ARTIST_ID, MediaStore.Audio.Media.DURATION };private MediaPlayer mMediaPlayer; // 声明播放器private Cursor mCursor; // 声明游标private int mPlayPosition = 0; // 当前播放的歌曲// 注册意图public static final String PLAY_ACTION = "com.wyl.music.PLAY_ACTION";public static final String PAUSE_ACTION = "com.wyl.music.PAUSE_ACTION";public static final String NEXT_ACTION = "com.wyl.music.NEXT_ACTION";public static final String PREVIOUS_ACTION = "com.wyl.music.PREVIOUS_ACTION";@Overridepublic IBinder onBind(Intent arg0) {return null;}@Overridepublic void onCreate() {super.onCreate();mMediaPlayer = new MediaPlayer();// 通过一个URI可以获取所有音频文件Uri MUSIC_URL = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;// 这里我过滤了一下,因为我机里有些音频文件是游戏音频,很短// 我这里作了处理,默认大于10秒的可以看作是系统音乐mCursor = getContentResolver().query(MUSIC_URL, mCursorCols,"duration > 10000", null, null);}@Overridepublic void onStart(Intent intent, int startId) {super.onStart(intent, startId);// 根据不同的action,做不同的相应String action = intent.getAction();//播放if (action.equals(PLAY_ACTION)) {play();//暂停} else if (action.equals(PAUSE_ACTION)) {pause();//下一首} else if (action.equals(NEXT_ACTION)) {next();//前一首} else if (action.equals(PREVIOUS_ACTION)) {previous();}}// 播放音乐public void play() {//初始化音乐播放器inite();}// 暂停时,结束服务public void pause() {//暂停音乐播放stopSelf();}// 上一首public void previous() {//得到前一首的歌曲if (mPlayPosition == 0) {mPlayPosition = mCursor.getCount() - 1;} else {mPlayPosition--;}//开始播放inite();}// 下一首public void next() {//得到后一首歌曲if (mPlayPosition == mCursor.getCount() - 1) {mPlayPosition = 0;} else {mPlayPosition++;}//开始播放inite();}// 初始化播放器public void inite() {//充值MediaPlayermMediaPlayer.reset();// 获取歌曲位置String dataSource = getDateByPosition(mCursor, mPlayPosition);// 歌曲信息String info = getInfoByPosition(mCursor, mPlayPosition);// 用Toast显示歌曲信息Toast.makeText(getApplicationContext(), info, Toast.LENGTH_SHORT).show();try {// 播放器绑定资源mMediaPlayer.setDataSource(dataSource);// 播放器准备mMediaPlayer.prepare();// 播放mMediaPlayer.start();} catch (IllegalArgumentException e1) {e1.printStackTrace();} catch (IllegalStateException e1) {e1.printStackTrace();} catch (IOException e1) {e1.printStackTrace();}}// 根据位置来获取歌曲位置public String getDateByPosition(Cursor c, int position) {c.moveToPosition(position);int dataColumn = c.getColumnIndex(MediaStore.Audio.Media.DATA);String data = c.getString(dataColumn);return data;}// 获取当前播放歌曲演唱者及歌名public String getInfoByPosition(Cursor c, int position) {c.moveToPosition(position);int titleColumn = c.getColumnIndex(MediaStore.Audio.Media.TITLE);int artistColumn = c.getColumnIndex(MediaStore.Audio.Media.ARTIST);String info = c.getString(artistColumn) + " "+ c.getString(titleColumn);return info;}// 服务结束时要释放MediaPlayerpublic void onDestroy() {super.onDestroy();mMediaPlayer.release();}
}

Android实现音乐后台播放相关推荐

  1. android 判断 音乐是否播放,Android如何判断当前手机是否正在播放音乐并获取有关正在播放的音乐的信息...

    我想实现以下情况,以确定音乐是否正在Android手机上播放,如果是,则通过特定手势进行播放, 或单击一个按钮分享我当前正在听的音乐. 第一步是确定当前是否正在播放音乐. 一开始,我认为这有点复杂. ...

  2. iOS音乐后台播放及锁屏信息显示

    实现音乐的后台播放.以及播放时,能够控制其暂停,下一首等操作,以及锁屏图片歌曲名等的显示 此实例须要真机调试.效果图例如以下: project下载:githubproject下载 实现步骤: 1.首先 ...

  3. iOS音乐后台播放、锁屏封面及播放控制

    在默认情况下App被切换到后台时,音乐的就停止播放了,但音乐类App的一般都会需要在后台继续播放,这样用户就可以一边听音乐,一边操作其他的App.对于这种情况我们可以对App做一些简单的配置,实现后台 ...

  4. 后台播放音乐时进来电话或微信视频通话暂停音乐播放 网易云音乐 喜马拉雅...

    最近项目中遇到一个问题,app内音乐后台播放时,如果有电话或者微信视频通话进来,app后台音乐还在播放.这样就造成用户体验不好,研究了市面上的音乐播放器,比如网易云音乐就很好的做到了如果有微信视频或者 ...

  5. 音乐播放器——实现后台播放、摇摇切歌等功能

    前言 首先声明,小白一只,android完全自学,若代码中有不妥或更简便的方法求指教(大佬带带我)... APP 欢迎界面 主界面 音乐界面 实现功能 1.遍历本地音乐 2.音乐后台播放 3.音乐封面 ...

  6. iOS音乐播放器的后台播放和远程控制

    iOS的后台任务一直有很严格的限制,一般情况下只有几类情况能使用后台任务,下面介绍其中的一种 音乐的后台播放. 1.要支持后台任务,首先你得告诉系统你需要后台任务,所以你首先在Info.plist文件 ...

  7. 安卓音乐播放时微信视频微信语音电话进来音乐暂停播放

    最近项目中遇到一个问题,app内音乐后台播放时,如果有电话或者微信视频通话进来,app后台音乐还在播放.这样就造成用户体验不好,研究了市面上的音乐播放器,比如网易云音乐就很好的做到了如果有微信视频或者 ...

  8. iOS从零开始学习直播之音频2.后台播放和在线播放

    本篇主要讲音频的后台播放和在线播放. 后台播放   上一篇写的工程运行之后程序退至后台,发现运行不了,歌停止了,这显然不行,音乐后台播放是标配啊.今天就来讲一下后台播放. 1.在plist文件里,告诉 ...

  9. android后台自播放音乐,Android实现后台播放音乐(Service方式)

    Android实现后台播放音乐(Service方式) 实现: 在res文件夹下添加raw文件夹,添加mp3/4格式的音乐文件 注意命名规则只能是a-z,0-9,和下划线_ 不能大写字母和- Andro ...

最新文章

  1. tensorflow sigmoid_cross_entropy_with_logits 函数解释
  2. CAD2010安装说明
  3. 初玩树莓派所遇见的坑
  4. 认识Java中volatile关键字
  5. PPT分享:用户画像场景与技术实现
  6. 克服浮躁_建立强大的全球社区时克服挑战
  7. 上海教育系统计算机职称考试报名,2008年第二季度上海市教育系统职称计算机考试报名的通知...
  8. 基于OpenCL的数字地形分析之坡度坡向提取
  9. java家庭记账管理系统_基于ssh/jsp/java/asp.net/php的家庭记账管理系统
  10. 用友U8 业务单据打印机设置
  11. 装两个独立的双系统,在笔记本电脑上
  12. 游戏建模:模型场景制作过程分享
  13. ImportError: No module named urlgrabber.grabber
  14. 容联七陌云客服通话超强稳定,今通国际客户服务更加便捷
  15. 【IDEA】IDEA常用配置
  16. 快乐共享(By Robinvane Suen)
  17. 硬盘只剩下一个大分区数据恢复图文教程
  18. 北航 计算机学院 讲师 清华大学,楚中毅 中文主页 北京航空航天大学教师个人主页系统...
  19. 测试使用CSDN写博客
  20. ajax上传文件(javaweb)

热门文章

  1. RocketMQ源码(19)—Broker处理DefaultMQPushConsumer发起的拉取消息请求源码【一万字】
  2. timemachine文件服务器地址,如何自己搭建一个Time Machine服务器
  3. 招商银行2022 FinTech训练营
  4. EOJ 1277/Ulm Local 1996 Humble Numbers
  5. 微信小程序1,常用组件 view、swiper、swiper-item、 scroll-view、 icon、progress、text、rich-text、button、input、image
  6. 全球大学生超级计算机竞赛排名,这所中国高校全球大学生超级计算机竞赛夺冠 怒赞...
  7. 公司邮箱如何注册163邮箱
  8. 华为云数据融合集成平台ROMA Connect,推进企业数字化转型
  9. L11:数据结构-3(链表)
  10. java计算机毕业设计校园二手商品交易系统源码+系统+数据库+lw文档+mybatis+运行部署