接:https://blog.csdn.net/weixin_43311389/article/details/83050954
在服务中定义播放音乐的逻辑,在MainActivity中操作服务中的方法。
MainActivity

package com.example.baidumusic;import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;public class MainActivity extends Activity {public static Handler handler=new Handler(){public void handleMessage(android.os.Message msg) {//获取我们携带的数据Bundle data=msg.getData();//获取歌曲的总时长和当前进度int duration=data.getInt("duration");int currentposition=data.getInt("currentposition");//设置seekbar的进度sbar.setMax(duration);sbar.setProgress(currentposition);};};private Iservice iservice;//这是我们定义的中间人对象private MyConn conn;private static SeekBar sbar;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//[3]混合方式开启服务//1 先调用startservice  目的是可以保证服务在后台长期运行Intent intent=new Intent(this,MusicService.class);startService(intent);//2 调用bindservice  目的为了获取我们定义的中间人对象  就可以间接地调用服务里的方法了conn = new MyConn();bindService(intent, conn, BIND_AUTO_CREATE);//[3]找到seekbar 设置进度sbar = (SeekBar) findViewById(R.id.seekBar1);//[4]给seekbar设置监听事件sbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {//当拖动停止的时候调用@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {iservice.callseekTo(seekBar.getProgress());}//当拖动开始的时候调用@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {// TODO Auto-generated method stub}//当进度改变的时候调用@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {// TODO Auto-generated method stub}});}@Overrideprotected void onDestroy() {// 当activity销毁的时候  解绑服务unbindService(conn);super.onDestroy();}//点击按钮 播放音乐public void click1(View v){//调用播放音乐的方法iservice.callplayMusic();}//点击按钮 暂停音乐public void click2(View v){//调用暂停音乐的方法iservice.callpauseMusic();}//点击按钮 继续播放音乐public void click3(View v){//调用继续播放音乐的方法iservice.callreplayMusic();}//监听服务的状态private class MyConn implements ServiceConnection{@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {//获取我们定义的中间人对象iservice = (Iservice) service;}@Overridepublic void onServiceDisconnected(ComponentName name) {}}
}

activity_main

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="com.example.baidumusic.MainActivity" ><Button android:onClick="click1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="播放"/><Button android:onClick="click2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="暂停"/><Button android:onClick="click3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="继续播放"/><SeekBarandroid:id="@+id/seekBar1"android:layout_width="match_parent"android:layout_height="wrap_content" /></LinearLayout>

MusicService

package com.example.baidumusic;import java.util.Timer;
import java.util.TimerTask;import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Binder;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Message;public class MusicService extends Service {private MediaPlayer mediaPlayer;@Overridepublic IBinder onBind(Intent intent) {//[2]把我们定义的中间人对象返回return new MyBinder();}//服务一开启  就执行这个方法@Overridepublic void onCreate() {mediaPlayer = new MediaPlayer();super.onCreate();}@Overridepublic void onDestroy() {super.onDestroy();}//实现指定位置播放public void seekTo(int position){mediaPlayer.seekTo(position);}//播放音乐的方法public void playMusic(){try {mediaPlayer.reset();//重置 解决一些bug//[2]设置要播放的资源位置   path  可以是网络路径 也可以是本地路径mediaPlayer.setDataSource("/mnt/sdcard/1.mp3");//[3]准备播放mediaPlayer.prepare();//[4]开始播放mediaPlayer.start();//[5]更新进度条updateSeekBar();} catch (Exception e) {e.printStackTrace();} }//更新进度条的方法private void updateSeekBar() {//【1】获取当前播放的总长度final int duration=mediaPlayer.getDuration();//[2]使用Timer 定时器 去实时获取当前进度final Timer timer=new Timer();final TimerTask task=new TimerTask() {@Overridepublic void run() {//[3]一秒钟获取一次当前的进度int currentposition=mediaPlayer.getCurrentPosition();//[4]拿着我们在MainActivity中创建的handler 发消息  消息就可以携带数据Message msg=Message.obtain();Bundle bundle=new Bundle();//mapbundle.putInt("duration", duration);bundle.putInt("currentposition", currentposition);msg.setData(bundle);//发送一条消息  MainActivity里面的handlemessage方法就会执行MainActivity.handler.sendMessage(msg);}};//100毫秒后  每隔一秒执行一次run方法timer.schedule(task, 100, 1000);//当歌曲播放完毕后   把timer和timertask取消//设置播放完成的监听mediaPlayer.setOnCompletionListener(new OnCompletionListener() {@Overridepublic void onCompletion(MediaPlayer mp) {System.out.println("歌曲播放完成了");//把timer 和timerTask取消一下timer.cancel();task.cancel();}});}//暂停音乐的方法public void pauseMusic(){//暂停音乐mediaPlayer.pause();}//继续播放音乐的方法public void replayMusic(){mediaPlayer.start();}//[1]在服务的内部定义一个中间人对象(IBinder)private class MyBinder extends Binder implements Iservice{//调用播放音乐的方法@Overridepublic void callplayMusic() {playMusic();}//调用暂停音乐的方法@Overridepublic void callpauseMusic() {pauseMusic();}//调用继续播放音乐的方法@Overridepublic void callreplayMusic() {replayMusic();}@Overridepublic void callseekTo(int position) {seekTo(position);}}
}

Iservice

package com.example.baidumusic;public interface Iservice {//把服务中想暴露的方法都定义在接口中public void callplayMusic();public void callpauseMusic();public void callreplayMusic();public void callseekTo(int position);
}

清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.baidumusic"android:versionCode="1"android:versionName="1.0" ><uses-sdkandroid:minSdkVersion="16"android:targetSdkVersion="16" /><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid:name=".MainActivity"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><service android:name="com.example.baidumusic.MusicService"></service></application></manifest>

效果

可实现拖拽调整进度
相较于百度音乐盒框架多用的知识点
1MeadiaPlayer的使用
2SeekBar的使用
3用Handler从服务向Activity传值,用Bundle代替msg.obj,传递多个值。
4Timer实现不断获取当前进度。

播放网络音乐
用mediaPlayer.prepareAsync();

public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}//点击按钮 播放一个音频文件public void click(View v){//[1]初始化mediaPlayerfinal MediaPlayer mediaPlayer=new MediaPlayer();try {//[2]设置要播放的资源位置   path  可以是网络路径 也可以是本地路径//TODO  部署网络路径  用tomcat开启本地服务器   里面有相应的歌曲资源mediaPlayer.setDataSource("http://192.168.11.86:8080/xpg.mp3");//[3]准备播放   异步准备mediaPlayer.prepareAsync();//[3.1]设置一个准备完成的监听mediaPlayer.setOnPreparedListener(new OnPreparedListener() {@Overridepublic void onPrepared(MediaPlayer mp) {//[4]开始播放mediaPlayer.start();}});} catch (Exception e) {e.printStackTrace();} }
}

MediaPlayer的生命周期

MediaPlayer(百度音乐盒案例)相关推荐

  1. 百度音乐盒案例(混合方式开启服务)

    接四大组件之服务 https://blog.csdn.net/weixin_43311389/article/details/83050020 原理详解请参考 https://blog.csdn.ne ...

  2. iOS一个模仿百度音乐盒的音乐播放器(带EQ均衡器)

    工作之余, 断断续续写了这么一个音乐播放器, eq实现各种音效, 指定位置播放, 快进快退, 锁屏耳机线控等等, 基本就是参考百度音乐盒的功能来实现的.(项目地址最后放出, 项目中的资源接口, 是抓百 ...

  3. html制作百度音乐标签页面,网页调用百度音乐盒

    在自己的网页中嵌入百度音乐盒 选择播放自己的音乐 完整代码如下: my music body{ margin:0; padding: 0; } .p{ font-size: 20px; font-fa ...

  4. jQuery练习 下拉更换背景+百度音乐盒

    下拉更换背景 <!DOCTYPE html> <html> <head><meta charset="UTF-8"><titl ...

  5. Android混合方式开启服务,百度音乐盒

    一.混合方式开启服务 需求:既想让服务在后台长期运行,又想调用服务里面的方法 1.先调用 startService 方法开启服务,能保证服务在后台长期运行 2.调用 bindService 方法,获取 ...

  6. 使用百度音乐盒API接口实现音乐播放器

    百度音乐盒提供了一个便捷的API可以拿来访问一些音乐资源,开发者通过访问指定格式的url可以拿到返回的数据,这个数据可以是json或者xml,这里面包含了歌曲的信息.完整的API各种访问格式是非常丰富 ...

  7. 计算机按出音乐盒,百度音乐盒打不开怎么办?百度音乐盒打不开问题的解决方案介绍...

    在用在百度音乐盒的时候会出现它打不开的异常状况,不知道大家有木有出现过这种情况,如果出现了,可以参照小编收集的以下方法尝试解决一下: 方案一: 步骤一:你的电脑里面安装了电脑管家的话就打开,然后在电脑 ...

  8. python3学习笔记之八——爬取百度音乐盒临时列表中的音乐

    没事儿打开百度音乐,随便点点喜欢的音乐,音乐就会加到百度音乐盒的临时列表之中了,但是想将列表中的音乐下载到本地就要登录百度账号. 那能不能不登录就将列表中的音乐下载下来? 通过fiddler抓包分析一 ...

  9. 如何在OpenWrt中添加新的profile【以百度音乐盒为例】

    一个profile包含了一个或者多个路由器型号,一般来说,同一个厂家的路由器定义,会放在同一个profile中. 下面就以添加百度音乐盒为例: 添加一个baidu.mk文件,路径如下图: 里面的内容如 ...

最新文章

  1. 军哥lnmp一键安装包nginx支持pathinfo配置
  2. 随机森林及重要参数解析
  3. c语言程序设计上机考试占多少分,C语言程序设计上机考试题目汇编.doc
  4. 2021年春季学期-信号与系统-第四次作业参考答案
  5. python制作猜拳游戏代码_python实现猜拳游戏项目
  6. Canvas绘制星球轨迹移动
  7. HTML5-基础语法
  8. List map转json
  9. 整理iOS9适配中出现的坑(图文)
  10. Unity3D 游戏资源提取工具
  11. 重装系统Win7步骤和详细教程
  12. [转] 快速掌握一个语言最常用的50%
  13. Caffe新手教程傻瓜系列(9):训练和测试自己的图片
  14. python玩王者荣耀皮肤_python 王者荣耀皮肤高清图片下载 附源码
  15. UnknownError: Failed to get convolution algorithm. This is probably because cuDNN failed to initial
  16. git push简介
  17. python生成曼德勃罗分形图形
  18. 【c++primer第五版】第十章习题答案
  19. 有关于论文投稿的问题
  20. 慧驱动正弦高频注入FOC学习笔记

热门文章

  1. 甲骨文云上使用arm架构实例和对象存储搭建Harbor
  2. 自动化测试工程师所用软件,【自动化测试工程师(软件)软件工程师面试题目|面试经验】-看准网...
  3. Netty框架-IO模型(Linux五大网络IO模型)
  4. 计算机软件研究生,计算机软件研究生论文.docx
  5. 导出EXCEL数据时防止数值变科学计数的办法
  6. 2014年蓝桥杯省赛:兰顿蚂蚁(简单模拟)
  7. 逸管家:共享经济时代,逸管家引领中小企业走向辉煌
  8. 对抗样本生成的PGD和CW方法
  9. ssh方式登录树莓派
  10. zookeeper使用