安卓应用背景音乐使用 MediaPlayer实现。

MediaPlayer创建通过方法 MediaPlayer.create(context, resId);
context为音乐播放器的上下文,取用this.getApplication().getApplicationContext()的上下文可以防止持有外部类导致Activity无法回收。在调用create方法前必须保证MediaPlayer对象为状态为空。否则将会报错。可在调用前判断是否为空,不为空则调用MediaPlayer.reset()方法进行重置。

播放音乐 MediaPlayer.start()

暂停音乐 MediaPlayer.pause()

设置音乐播放完毕事件 mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
//do something…
}
});
顺序播放:
重置创建播放器,资源使用列表下一首->设置播放完毕事件->音乐播放
在播放完毕事件中回调整个方法。

随机播放:
与顺序播放区别在于,在创建播放器时随机获取列表中的资源

上一曲、下一曲
手动调用上述的方法即可。

进度条
使用mediaPlayer.getCurrentPosition()获取当前播放位置, mediaPlayer.getDuration()获取歌曲总长度,使用Timer进行不断发请求获取当前位置并渲染进度条控件即可。

多个界面共享音乐播放器

在写音乐播放器代码时,我想要音乐按钮不止在主界面可以使用,在数字选择界面,在数字书写界面等其他界面我也想能够随时控制音乐的播放与停止状态。即应用的所有界面共享同一个音乐播放器。

我的思路是定义一个BasicActivity类,将音乐播放器设置为静态对象,在所有Activity中均继承基本类,实现音乐播放器共享。布局文件中按钮有两种状态,音乐正在播放,音乐停止播放,当Activity切换时我们就需要根据当前播放状态去渲染音乐按钮,音乐按钮可以每个布局文件中定义,而我定义在了BasicActivity的布局文件中,并在其他布局文件中使用<include>标签引用,此功能实现代码如下。

当我们进入一个拥有音乐按钮的界面时,需要做三件事
1.调用setContentView设置布局文件 2.获取按钮并根据状态设置背景图片 3.播放音乐并设置播放完成切换歌曲事件

当进入主应用界面时第一次初始化音乐播放器开始播放音乐,在跳转后不改变音乐播放器状态,仅根据播放器状态渲染控件。
所以讲音乐播放和设置下一曲的调用放在主应用界面的Activity中,而渲染控件放在BasicActivity中进行。

效果是进入主界面即开始播放歌曲,之后任意切换界面都不影响音乐播放,并且每个界面都可以停止或播放歌曲。

若遇到程序报空指针错误,错误指向music_btn.setBackgroundResource(R.mipmap.btn_music1)等对控件操作的调用时,可能是在调用顺序上出了问题,在使用findViewById时还未调用setContentView,导致获取的控件是null。所以在使用findViewById时必须确认在此之前已经使用setContentView设置了主布局。

具体实现代码如下

BasicActivity

public class BasicActivity extends Activity {static boolean isPlay = true;  //播放状态static MediaPlayer mediaPlayer;  //音乐播放器static int musicIndex = 0;  //当前播放序号static Context context;  //上下文static int[] musicList = {R.raw.high_hopes, R.raw.don_t_miss_now, R.raw.don_t_you_worry_child};  //播放歌曲列表Button music_btn;  //前台按钮控件@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);context = this.getApplication().getApplicationContext();//通过id获取布局文件中按钮控件music_btn = (Button) findViewById(R.id.btn_music);//根据播放状态渲染按钮图片if (isPlay) {music_btn.setBackgroundResource(R.mipmap.btn_music1);} else {music_btn.setBackgroundResource(R.mipmap.btn_music2);}//内存监视器RefWatcher refWatcher = App.getRefWatcher(this);refWatcher.watch(this);}//点击事件,将播放器状态置反并渲染按钮图片public void onClick(View v) {if (isPlay) {if (mediaPlayer != null) {mediaPlayer.pause();music_btn.setBackgroundResource(R.mipmap.btn_music2);isPlay = false;}} else {mediaPlayer.start();music_btn.setBackgroundResource(R.mipmap.btn_music1);isPlay = true;}}//设置播放器播放完毕回调函数,进行歌曲切换public static void setPlayList() {try {mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {@Overridepublic void onCompletion(MediaPlayer mp) {musicIndex++;if (musicIndex >= musicList.length) {musicIndex = 0;}playMusic(musicList[musicIndex]);setPlayList();}});} catch (Exception e) {e.printStackTrace();}}//播放歌曲,保证播放器为空后创建新的播放器,开始播放音乐public static void playMusic(int resId) {if (mediaPlayer != null) {mediaPlayer.reset();}mediaPlayer = MediaPlayer.create(context, resId);mediaPlayer.start();}}

-------------------------BasicLayout----------------------

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="60dp"android:layout_height="60dp"android:layout_margin="10dp"android:layout_alignParentBottom="true"tools:context=".BasicActivity"><Buttonandroid:id="@+id/btn_music"android:layout_width="60dp"android:layout_height="60dp"android:layout_margin="0dp"android:background="@drawable/btn_music"android:onClick="onClick" /></RelativeLayout>

------------------------MainActivity----------------------

//继承了BasicActivity
public class MainActivity extends BasicActivity {@Override
protected void onCreate(Bundle savedInstanceState) {//必须先设置视图,而后调用BasicActivity的onCreate函数//若顺序反过来将会报空指针错误,因为没有渲染前台控件,则没有音乐按钮setContentView(R.layout.activity_main);super.onCreate(savedInstanceState);playMusic(musicList[musicIndex]);setPlayList();
}
//跳转游戏选择界面public void OnPlay(View v) {startActivity(new Intent(MainActivity.this, SelectActivity.class));}
//跳转关于我们界面public void OnAbout(View v) {startActivity(new Intent(MainActivity.this, AboutActivity.class));}
}

----------------------MainLayout----------------------

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:background="@drawable/main_bg"tools:context="com.example.wangjy.activity.MainActivity"><Buttonandroid:layout_width="60dp"android:layout_height="60dp"android:layout_above="@+id/btn_about"android:layout_centerHorizontal="true"android:background="@drawable/btn_play"android:onClick="OnPlay" /><include layout="@layout/activity_basic" /><Buttonandroid:id="@+id/btn_about"android:layout_width="60dp"android:layout_height="60dp"android:layout_alignParentBottom="true"android:layout_alignParentEnd="true"android:layout_alignParentRight="true"android:layout_margin="10dp"android:background="@drawable/btn_about"android:onClick="OnAbout" /></RelativeLayout>

安卓APP实战(四):音乐播放器及多Activity共享音乐播放器实现相关推荐

  1. python安卓开发视频_python开发安卓App实战项目:西瓜视频解析工具

    [Python] 纯文本查看 复制代码import os import base64 from kivy.app import App from kivy.network.urlrequest imp ...

  2. python制作安卓app_python开发安卓App实战项目:西瓜视频解析工具

    python要开发app就要用到kivy的模块,关于kivy开发环境的安装网上非常多,就不多说了. 整个开发过程主要涉及布局和事件两个方面,首先是关于布局方面 [Python] 纯文本查看 复制代码 ...

  3. 安卓APP源码和报告——音乐播放器

    课 程 设 计 报 告 院 系: 专 业: 题 目: 科 目: 学 生: 指导教师: 完成时间: 目 录 1. 引言1 1.1 目的1 1.2 背景1 2. 需求分析1 3. 系统设计1 3.1总体设 ...

  4. 安卓网apk安装器_安卓APP推荐:假日时间规划师,定时音乐播放器,最小的APK提取器...

    今天小趣同学给大家推荐3款非常精美实用的安卓APP,都是小编精心挑选出来的应用,喜欢的同学可以试试: Sectograph-假日里的时间规划师 Sectograph 是一款非常精美实用的时间规划应用, ...

  5. 【毕业设计_课程设计】基于安卓APP的音乐播放器设计

    文章目录 0 项目说明 1 模块设计架构 2 界面效果 3 项目源码 0 项目说明 基于安卓APP的音乐播放器设计 提示:适合用于课程设计或毕业设计,工作量达标,源码开放 1 模块设计架构 1.音乐播 ...

  6. 本科生尝试安卓APP开发:手机调音器节拍器(音乐学习者使用)

    目录 写在前面 本项目的灵感来源 作品完成度 项目介绍 APP的名字:沐尘调音器 APP功能介绍 调音器 节拍器 实际测试 调音器测试 节拍器测试 项目内容 开发环境 APP功能原理 1.调音器-编程 ...

  7. android能播放4k视频格式,安卓APP,无广告支持多种格式的万能视频播放器

    原标题:安卓APP,无广告支持多种格式的万能视频播放器 万能视频播放器 万能视频播放器是一款专业的视频播放工具.它支持所有视频格式,支持 4K/超高清视频文件,并且能够高清播放.它是安卓手机和平板上欣 ...

  8. 音乐播放器的实现(四)—— 歌曲列表、顺序播放、单曲循环、随机播放、自动下一曲

    音乐播放器的实现(四)-- 歌曲列表.顺序播放.单曲循环.随机播放.自动下一曲 传送门:(完整工程见第五章篇尾) 音乐播放器的实现(一)-- Audio Listener和Audio Source面板 ...

  9. React全家桶构建一款Web音乐App实战(九):皮肤切换

    这一节是这款React Web音乐App实战的最后一节:皮肤切换功能.皮肤切换是Web音乐App中一个与核心无关的功能,加入这个功能可以为应用增添不少趣味性 实现思路 实现皮肤切换功能的大致原理就是将 ...

最新文章

  1. CRM中Plugin开发如何将功能放入多个模块
  2. Go: 分布式学习利器(2)-- Go中的变量,常量 以及与其他语言变量之间的差异
  3. 查看Oracle数据库中的,已经连接好的..当前用户状况
  4. 递归实现显示目标文件夹的所有文件和文件夹,并计算目标文件夹的大小
  5. java 拦截器响应中取所有参数,spring boot拦截器中获取request post请求中的参数
  6. php模块memcache和memcached区别分析
  7. 如何在Win Server 2008R2环境下,把域帐户加到本地管理员组??
  8. 用java打出矩形阵型的数字_java输出数字发散矩形
  9. linux一键安装python_Linux下,一键安装python3;适用于Centos、Debian、Ubuntu等
  10. gohost -- go 开发的命令行hosts配置管理工具
  11. [bzoj 4066]简单题
  12. Rainmeter新手教程
  13. JAVA--计算长方体、四棱锥的表面积和体积
  14. 聚焦存储即平台,浪潮存储迎来发展新机遇
  15. 微信小程序入门:和风天气小程序
  16. 智能客服搭建(1) - MRCP Server 搭建
  17. WPS中文档横线的问题
  18. 巴拿赫空间上的复变函数
  19. 淘宝x-sign, x-mini-wua, x-sgext, x-umt挂unidbg分析
  20. :aria-checked_动手使用ARIA:首页元素和标准导航

热门文章

  1. 学习笔记:mouseenter 与 mouseover,offset
  2. 5G换手机不必换号 中国移动已确认资费不会高于4G
  3. Python中集合set和字典dict的用法区别
  4. Junit5测试框架实战
  5. 究竟什么占用了你的显存容量
  6. 如何使用 rmdir 命令删除目录?
  7. 论文笔记 Deep Facial Expression Recognition: A Survey深度面部表情识别调查
  8. 赫尔德不等式详细证明
  9. dedecmsnbsp;自定义标签
  10. 利用caffe的solverstate断点训练