首先你你需要知道MediaPlayer这个类的一些方法:

  • int getDuration():获取流媒体的总播放时长,单位是毫秒。
  • int getCurrentPosition():获取当前流媒体的播放的位置,单位是毫秒。
  • void seekTo(int msec):设置当前MediaPlayer的播放位置,单位是毫秒。
  • void setLooping(boolean looping):设置是否循环播放。
  • boolean isLooping():判断是否循环播放。
  • boolean isPlaying():判断是否正在播放。
  • void prepare():同步的方式装载流媒体文件。
  • void prepareAsync():异步的方式装载流媒体文件。
  • void release ():回收流媒体资源。
  • void setAudioStreamType(int streamtype):设置播放流媒体类型。
  • void setWakeMode(Context context, int mode):设置CPU唤醒的状态。
  • setNextMediaPlayer(MediaPlayer next):设置当前流媒体播放完毕,下一个播放的MediaPlayer。

注意一下两点

  1. 在使用MediaPlayer播放一段流媒体的时候,需要使用prepare()或prepareAsync()方法把流媒体装载进MediaPlayer,才可以调用start()方法播放流媒体。                 
  2. setAudioStreamType()方法用于指定播放流媒体的类型,它传递的是一个int类型的数据,均以常量定义在AudioManager类中, 一般我们播放音频文件,设置为AudioManager.STREAM_MUSIC即可。

在播放下一首歌曲的时候需要释放MediaPlayer的资源:

if (mediaPlayer != null && mediaPlayer.isPlaying()) {mediaPlayer.stop();mediaPlayer.release();mediaPlayer = null;}

然后就是关于BinderService:

  • 先看一下按下Back键之后Activity的生命周期:onPause()-->onStop()-->onDestory()-->onCreate()-->onStart()-->onResum();

  • BinderService的存活于绑定的Activity有关,当与之绑定的Activity被销毁的时候,Service也会销毁,根据生命周期,我们就可以知道,当你按下Back键的时候,Service也会销毁,这样音乐就会停止播放,但是我们使用的大多数音乐播放器软件都按下Back键之后依旧在播放,所以,就有了我们的startServuce()和binderService()混合开发,因为startService()的生命周期与activity无关。

  • 我们的主要逻辑是,用startService播放音乐,用binderService()控制音乐的播放。

  • startService很常见,就不说了,你需要知道binderService的使用,其实binderService就是用一个继承与BInder的MyBinder的类,作为一个中间对象,在Activity中对Service中的方法进行调用,从而实现控制。

下面我们开始编写我们的音乐播放器

创建一个MusicItem类记录一些音乐的信息

public class MusicItem {public String name;public String data;public String artist;public long time;
}

请求读写权限并且获取手机上的所有音频文件

private void initData(){if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {if (PackageManager.PERMISSION_DENIED == checkSelfPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE)){requestPermissions(new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE},0);}}itemList = new ArrayList<>();new Thread(){@Overridepublic void run() {super.run();ContentResolver resolver = mContext.getContentResolver();Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;String[] objs ={MediaStore.Audio.Media.DISPLAY_NAME,MediaStore.Audio.Media.DATA,MediaStore.Audio.Media.ARTIST,MediaStore.Audio.Media.DURATION,};Cursor cursor = resolver.query(uri,objs,null,null,null);if (cursor !=null){while (cursor.moveToNext()){MusicItem musicItem = new MusicItem();itemList.add(musicItem);String name = cursor.getString(0);musicItem.name = name;String data = cursor.getString(1);musicItem.data = data;String aritst = cursor.getString(2);musicItem.artist = aritst;long time = cursor.getLong(3);musicItem.time = time;}cursor.close();}handler.sendEmptyMessage(0);}}.start();}

获取到手机上的所有的音频文件之后,发送一个handler消息,将musicItem的集合itemList中的数据显示在Adapter上(Adapter的代码这里不拿出来说了,很见到的)

创建一个MusicService类,继承与Service

这个类用来后台播放音乐

public class MusicService extends Service {private MediaPlayer player;@Nullable@Overridepublic IBinder onBind(Intent intent) {return new MyBinder();}@Overridepublic void onCreate() {super.onCreate();}public void onPause(){player.pause();}public void onStart(){player.start();}public void openAudio(String uri) throws IOException {if (player != null && player.isPlaying()){player.stop();player.release();player = null;}player = new MediaPlayer();player.setAudioStreamType(AudioManager.STREAM_MUSIC);try {player.setDataSource(uri);player.prepare();player.start();} catch (IOException e) {e.printStackTrace();}}public class MyBinder extends Binder{MusicService getService(){return MusicService.this;}}@Overridepublic void onDestroy() {super.onDestroy();player.stop();player.reset();player.release();}
}
  • MyBinder是Activity与MusicService进行通信的中间对象(这里只实现了播放和暂停的功能)

绑定MusicSerivce

下面是Activity的onCreate()方法:

@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_main);mContext = this;lvList = (ListView) findViewById(R.id.lv_list);Button start = (Button) findViewById(R.id.start);Button pasue = (Button) findViewById(R.id.pause);pasue.setOnClickListener(this);start.setOnClickListener(this);Intent intent = new Intent(MainActivity.this,MusicService.class);startService(intent);bindService(intent,conn,BIND_AUTO_CREATE);initData();}

绑定Service:

private ServiceConnection conn = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {service1 = ((MusicService.MyBinder) service).getService();}@Overridepublic void onServiceDisconnected(ComponentName name) {}};

点击ListView中的Item的时候播放音乐

实现暂停和播放:

private android.os.Handler handler = new android.os.Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);if (itemList != null && itemList.size()>0){MusicAdapter adapter = new MusicAdapter(mContext,itemList);lvList.setAdapter(adapter);lvList.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {try {service1.openAudio(itemList.get(position).data);} catch (IOException e) {e.printStackTrace();}}});}}};
@Overridepublic void onClick(View v) {switch (v.getId()){case R.id.start:service1.onStart();break;case R.id.pause:service1.onPause();break;}}
  • 当绑定成功的时候,返回的是一个MusicService对象,拿着这个Service对象就能对MusicService中的方法进行调用了。
  • 首先startService,然后在binderService让Activity与Service之间进行通信,然Activity通过MyBinder对象对Service中的方法进行调用。

Service的销毁

在Activity中的onDestory()方法中对MusicService进行取消绑定:

@Overrideprotected void onDestroy() {super.onDestroy();unbindService(conn);}

记得添加读写权限

转载于:https://www.cnblogs.com/Godfunc/p/6551294.html

startService和onBinderService混合开发音乐播放器相关推荐

  1. vueJs开发音乐播放器第二篇(点击歌单跳出详情页)

    继上一篇开发音乐播放器歌单列表页 (1.使用router定义跳转链接,2. 使用axios得到音乐第三方数据,并渲染到页面上,3.组件之间传值(props)) 1.接下来使用了vue-router路由 ...

  2. 【网络收录】基于51单片机开发音乐播放器

    [网络收录]基于51单片机开发音乐播放器 本文作者:天析 作者邮箱:2200475850@qq.com 发布时间: Thu, 22 May 2014 18:14:00 +0800 特别声明:本资料来源 ...

  3. linux 基于qt开发的音乐,Linux下用QT开发音乐播放器.pdf

    嵌入式课程设计报告 - Linux 在 下开发音乐播放器 李荣贵 141578 一.概述 按课程要求,在Linux环境下开发了一款简易的音乐播放器软件, Mini 名为 " 音乐播放器&qu ...

  4. Xamarin.Android开发音乐播放器

    最近.Net开源着实让C#火了一把,好久就听说Mono for Android一直没静下心来看,上周末找来看看,确实不错,前台界面axml编写跟Java安卓开发毫无区别,后台用C#其实很多window ...

  5. 2020 零基础 Vue综合应用 教开发音乐播放器—悦听(激发编程乐趣)【整理+源码】

    文章目录 1.引言 2.音乐播放器完整版效果图如下: 3.接口引用 4.示例代码 5.结束语 点击进入Vue❤学习专栏~ 1.引言 这是Vue学习的综合应用篇,教你开发一个音乐播放器,能听歌,能看热门 ...

  6. android开发音乐播放器,Android开发简易音乐播放器

    这里介绍一个简易的音乐播放器,供大家参考,具体内容如下 效果图如下: 但是,由于这是一个简易版的音乐播放器,所播放的音乐只有一首,且被写死,但,操作却十分简单,方便理解! 这是代码的主要设计: 音乐主 ...

  7. python开发音乐播放器教程_python开发简易版在线音乐播放器示例代码

    在线音乐播放器,使用python的Tkinter库做了一个界面,感觉这个库使用起来还是挺方便的,音乐的数据来自网易云音乐的一个接口,通过urllib.urlopen模块打开网址,使用Json模块进行数 ...

  8. python开发音乐播放器教程,Python挑翻音乐网,GUI实现音乐播放器,无敌Pythoner炼成记!...

    今天几篇博文都是些Python纯干货,有难度大的,也有难度比较低的适合新手的.但无一列外,就是它们都会有源码+视频教程二合一供大家学习.这样的文章有个好处,本人的文章多次遭其它人copy到其它网站,这 ...

  9. Android开发----音乐播放器(界面设计)

    转眼也沦为"大四狗"的行列当中去,本来打算在暑假的时候找一个实习,结果学校临时安排了"暑期实训" 原本计划好的安排全部被打乱了,哎~~~也只能跟着学校的脚步&q ...

最新文章

  1. 《C++ Primer 4th》读书笔记 第5章-表达式
  2. percent之集合
  3. java01背包问题算法_经典动态规划--01背包问题
  4. 动态DNS——本质上是IP变化,将任意变换的IP地址绑定给一个固定的二级域名。不管这个线路的IP地址怎样变化,因特网用户还是可以使用这个固定的域名 这样看的话,p2p可以用哇...
  5. c语言填空三个数找中间大小,计算机文化基础复习题及答案(精华)
  6. 系统需求分析文档需要考虑的问题
  7. 教你玩转CSS表格(table)
  8. 一对一语音视频直播双端原生+php后台源码
  9. Sharding-JDBC读写分离_实现_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记017
  10. iOS - UIActivityIndicatorView
  11. UVA - 10129 Play on Words(欧拉回路)
  12. 角色从项目经理转换ScrumMaster的一些思考和总结
  13. 关于 intptr_t
  14. C++实现各种进制转换
  15. VBA学习笔记之单元格
  16. 洛谷P1007独木桥题解--zhengjun
  17. c#实现爬虫获取小说(.NET)
  18. 如何在eclipse中创建jsp工程项目
  19. java编写爬虫_手把手教你从零开始用Java写爬虫
  20. Adam,AdamW,LAMB优化器原理与代码

热门文章

  1. 【SpringBoot】开启热部署(jsp 页面热部署、devtools 全局热部署)
  2. 能做出这样的数据可视化报告,不信老板不给你加薪
  3. Gartner2017年数据科学领域最酷供应商出炉,实至名归
  4. 参与就有1000块,30W奖池你占一半 | 帆软开发者大赛招募
  5. SpringActionscript3 片断
  6. hadoop python入门_Hadoop Streaming入门
  7. hive 查询是否包含字符串_oracle判断一个字符串中是否包含另外一个字符串
  8. 找不到服务器micro,Go Micro服务发现
  9. log4j2 mysql_[简单]log4jdbc-log4j2配置简记
  10. 数据结构 2-3-4 静态链表