以下记录用 Service + MediaPlayer 实现网络音频文件的播放

1. Service 的实现

public class MusicPlayerService extends Serviceimplements MediaPlayer.OnPreparedListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnBufferingUpdateListener,MediaPlayer.OnErrorListener, MediaPlayer.OnInfoListener {private String TAG = "Music-->log--> MusicPlayerService";//当前正在工作的播放器对象private MediaPlayer mMediaPlayer;@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.d(TAG, "onStartCommand: intent " + intent + " flags " + flags + " startId " + startId);return super.onStartCommand(intent, flags, startId);}@Overridepublic IBinder onBind(Intent intent) {Log.d(TAG, "onBind: intent " + intent);//设置代理,所有播放相关的操作通过代理暴露给AvtivityMusicPlayerBinder musicPlayerBinder = new MusicPlayerBinder(MusicPlayerService.this);prepareMusic();return musicPlayerBinder;}/*** 准备MediaPlayer环境*/private void prepareMusic() {try {mMediaPlayer = new MediaPlayer();mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); //设置音频流的类型。mMediaPlayer.setOnPreparedListener(this); // 准备好mMediaPlayer.setOnCompletionListener(this); //播放完成事件监听器mMediaPlayer.setOnBufferingUpdateListener(this); //缓冲变化mMediaPlayer.setOnErrorListener(this); //出错mMediaPlayer.setOnInfoListener(this); //音频信息mMediaPlayer.setWakeMode(MusicPlayerService.this, PowerManager.PARTIAL_WAKE_LOCK); //为MediaPlayer设置低级电源管理行为Class<MediaPlayer> clazz = MediaPlayer.class;Method method = clazz.getDeclaredMethod("setDataSource", String.class, Map.class);String path = "http://mp3.9ku.com/hot/2007/11-01/91161.mp3";  //音乐文件Log.e(TAG, "playMusic: startPlay-->: ID: ,PATH:" + path);method.invoke(mMediaPlayer, path, null);mMediaPlayer.prepareAsync();} catch (Exception e) {e.printStackTrace();}}/*** 暴露给代理Binder的 开始播放 的方法*/public void startMusic() {Log.d(TAG, "startMusic: ");mMediaPlayer.start();}/*** 暴露给代理Binder的 停止播放*/public void stopMusic() {mMediaPlayer.stop();}/*** 暴露给代理Binder的 暂停播放*/public void pause() {Log.d(TAG, "pause: ");mMediaPlayer.pause();}/*** MediaPlayer 初始化完成** @param mediaPlayer*/@Overridepublic void onPrepared(MediaPlayer mediaPlayer) {Log.d(TAG, "onPrepared: MediaPlayer 初始化完成  ");}/*** 缓冲百分比*/@Overridepublic void onBufferingUpdate(MediaPlayer mp, int percent) {Log.d(TAG, "onBufferingUpdate:  mp " + mp + " percent " + percent);}/*** 播放完成调用*/@Overridepublic void onCompletion(MediaPlayer mp) {Log.d(TAG, "onCompletion:  mp " + mp);}/*** 播放失败*/@Overridepublic boolean onError(MediaPlayer mp, int event, int extra) {Log.d(TAG, "onError:  mp " + mp + " extra " + extra + " event " + event);return false;}/*** 获取音频信息*/@Overridepublic boolean onInfo(MediaPlayer mp, int event, int extra) {Log.d(TAG, "onInfo:  mp " + mp + " event " + event + " extra " + extra);return false;}/*** 与Activity解除绑定,即Activity销毁时回调的生命周期方法*/@Overridepublic boolean onUnbind(Intent intent) {Log.d(TAG, "onUnbind: intent " + intent);return super.onUnbind(intent);}@Overridepublic void onDestroy() {Log.d(TAG, "onDestroy: ");super.onDestroy();}
}

2.代理类,将所有播放相关的暴露给Activity

public class MusicPlayerBinder extends Binder {private final MusicPlayerService mService;public MusicPlayerBinder(MusicPlayerService musicPlayerService) {this.mService = musicPlayerService;}public void startMusic() {mService.startMusic();}public void stopMusic() {mService.stopMusic();}public void pause() {mService.pause();}
}

3.Activity 绑定Service,操作音频文件

public class MusicPlayerActivity extends AppCompatActivity implements View.OnClickListener {private String TAG = "Music-->log--> MusicPlayerActivity";private MusicPlayerBinder mBinder;private MusicPlayerServiceConnection mConnection;@Overrideprotected void onDestroy() {super.onDestroy();Log.d(TAG, "onDestroy: ");unbindService(mConnection);}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_music_player);initViews();openService();}private void initViews() {Button btnStart = findViewById(R.id.music_btn_start);Button btnPause = findViewById(R.id.music_btn_pause);btnStart.setOnClickListener(this);btnPause.setOnClickListener(this);}/*** 采用两种方式与Service建立连接* startService :使Service长期在后台存在,不受Activity生命周期的影响* bindService :使Activity能拿到Service的代理对象,能对Service进行操作*/private void openService() {Intent intent = new Intent(this, MusicPlayerService.class);startService(intent);mConnection = new MusicPlayerServiceConnection();bindService(intent, mConnection, Context.BIND_AUTO_CREATE);}@Overridepublic void onClick(View v) {int i = v.getId();if (i == R.id.music_btn_start) {mBinder.startMusic(); //播放音乐} else if (i == R.id.music_btn_pause) {mBinder.pause(); // //暂停播放}}/*** Service绑定成功后的监听* MusicPlayer Service Connection*/private class MusicPlayerServiceConnection implements ServiceConnection {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {Log.d(TAG, "onServiceConnected: ");if (null != service) {if (service instanceof MusicPlayerBinder) {mBinder = (MusicPlayerBinder) service;Log.d(TAG, "onServiceConnected: mBinder " + mBinder);}}}@Overridepublic void onServiceDisconnected(ComponentName name) {}}
}

4.注意

1.权限

<uses-permission android:name="android.permission.INTERNET" />
<!-- 系统锁的机制, 只要有人拿着这个锁,系统就无法进入休 Service播放音乐,需要此权限-->
<uses-permission android:name="android.permission.WAKE_LOCK" />

2.Android9.0手机不做htts校验

参考

Android开发之MediaPlayer详解

有关Service的startService与bindService在各种情形下生命周期的变化

Android实现媒体播放_01最简单的仅记录下流程相关推荐

  1. mp4 android自动播放,Android 使用VideoView播放MP4的简单实现

    使用VideoView播放MP4 播放示例 实现简单的播放功能,播放手机本地的MP4文件.不依赖任何第三方框架,不添加任何防腐剂. 添加一个系统自带的控制条. 申请权限 读取存储中的MP4文件 准备布 ...

  2. android 播放静态mp4,Android 使用VideoView播放MP4的简单实现

    使用VideoView播放MP4 播放示例 实现简单的播放功能,播放手机本地的MP4文件.不依赖任何第三方框架,不添加任何防腐剂. 添加一个系统自带的控制条. 申请权限 读取存储中的MP4文件 准备布 ...

  3. Android的媒体播放器------简易音乐播放器(详解)

    一.案例效果 二.欢迎界面的设计与功能 2.1 .案例效果 设计一个倒计时自动跳转的页面 2.2. 布局界面 activity_welcome.xml 参考代码: <?xml version=& ...

  4. Android的媒体播放器——简易视频播放器(详解)

    一.案例效果 二.主界面的设计与功能 2.1 案例效果 2.2 布局界面 activity_main.xml 参考代码: <?xml version="1.0" encodi ...

  5. libvlc获取一帧_android - 从android vlc媒体播放器获取当前帧 - 堆栈内存溢出

    我找到了一个非常简单,非常快速的解决方案. 只需使用TextureView而不是SurfaceView ,然后在使用getBitmap()函数播放时随时检索图像,如下所示. public class ...

  6. 30个最佳和免费的Android媒体播放器

    今天发布的内容有所不同,我们为您介绍了Google Play App Store提供的The Best Android Media Player . 1. MusiXmatch歌词播放器 狂热的音乐爱 ...

  7. 基于android的音乐播放器毕业设计,基于android音乐播放器的毕业设计ppt

    <基于android音乐播放器的毕业设计ppt>由会员分享,可在线阅读,更多相关<基于android音乐播放器的毕业设计ppt(29页珍藏版)>请在人人文库网上搜索. 1.1. ...

  8. 便携式媒体播放器:电路、工作、布线及其应用

    媒体播放器设备播放音频文件和数字视频.目前,有多种便携式媒体播放器可以简单地播放不同的数字音频.视频和图像文件.先进的媒体播放器支持游戏:录制视频并提供额外的存储空间.所以通常这个空间是存储卡槽的形式 ...

  9. Android语音消息播放(MediaPlayer) 踩坑

    引言 最近项目中的IM模块收到反映,语音消息点了之后正在播放却没有声音,有时甚至直接ANR异常,因项目中的IM采用的是网易的云信,所以第一时间请教了云信的技术人员,得到的回复是他们的SDK播放语音是直 ...

最新文章

  1. LeetCode Minimum Genetic Mutation(dfs,bfs)
  2. css 盒子有内容 盒子往下掉_css盒子模型与文本溢出学习笔记
  3. nginx + mysql + php-fpm 环境
  4. MVC系列-6.注册页面
  5. python 三元运算符求abc_python三元运算符实现方法
  6. Ubuntu 下常用的命令 简略记录
  7. ubuntu19.10安装haroopad软件
  8. mybatis+spring+c3p0+maven+ehcache
  9. php无法连通mysql_怎么解决php无法连接mysql的问题
  10. [BZOJ5329][Sdoi2018]战略游戏 圆方树+虚树
  11. Windows7 USB/DVD Download Tool – U盘安装Win7工具
  12. 【定位】TOF与TDOA
  13. 100款经典黑客小工具使用说明
  14. 360浏览器html在哪儿,360浏览器的收藏夹在哪_如何找到360浏览器收藏夹路径位置...
  15. grads插值_GrADS中填色标尺cbarn用法
  16. adventureworks mysql_adventureworks
  17. matlab幻方变换_Matlab入门1-幻方矩阵
  18. 希腊字母与英文读音中文读音对照表
  19. [整站源码]thinkphp古筝古琴书画培训类网站模板+前后端源码
  20. 将家人从Gmail,Thunderbird,Outlook等迁移到Google Apps:权威指南

热门文章

  1. rocketmq本地demo搭建
  2. Java基础练习题11--[已知有十六支男子足球队参加2008 北京奥运会。 写一个程序,把这16 支球队随机分为4 个组,每组4只球队。采用List集合和随机数 2008 北京奥运会男足参赛国家:]
  3. 面渣逆袭:Redis连环五十二问,图文详解,这下面试稳了
  4. 如何选择负载均衡设备?
  5. 基于图像处理的工具尺寸测量
  6. Fluent常见问题
  7. C语言实现3个数大小比较
  8. Linux 计算机网络 从 ping 来初窥计算机网络
  9. 黑客侦察和隐藏IP地址的方法
  10. 轻听-最好的解压助眠医疗轻音乐集