fuerbosi 2014-07-25
本来只想做一个简单的锁屏界面控制音频APP播放音乐的快捷方式。方便在锁屏页面操作音乐软件暂停,下一曲等功能,主体功能实现并不复杂。
由于有一些外接耳机上带有类似的一些功能按钮,Android系统为了实现耳机对播放音乐的控制,开发了对外的接口。其实就是利用广播机制,通过发送广播来对播放器进行控制。这些广播会首先进入系统中的AudioManager中,通过binder最终进入AudioService进行了一些处理,为了音频不会出现混乱。我们不用管它,我们只需要知道播放器最终会接收到这个广播而进行相应的处理即可。整套流程网上有很多样例,只不过是发送各种模仿按键的广播即可做到,这里不做叙述。主要说明一下过程中出现的几个小问题。
1.播放与暂停,这是同一个按钮。只是要根据当前的情况不同来执行不同的功能,尤其是初始状 态,有可能改程序执行时,已经有音乐在播放,所以这里要进行判断,这个可以通过AudioManager的isMusicActive()方法来判断音乐的状况,但是由于智能判断音乐是否开始,但是无法分辨出音乐结束还是暂停。
2.一般的播放器会有拔出耳机就暂停音乐的设定,所以我们的控制器也要随之变化,不过android系统提供了耳机拔出或插入的广播,我们可以监听这个广播然后进行操作。
3.由于有的播放器在通知栏可以操作播放器播放状态,所以他可以不开屏的状态下直接暂停(或其他操作)音乐。但是我们在锁屏页面无法知道这个操作,无法更新我们页面的按钮。而且通知栏操作属于其软件的内部操作,不需要像我们一样使用广播,所以也无法监听广播来控制。经过思考,由于没有接收到通知的方法。只能选择监控的方式来进行,所以我在后台写了一个timer来每间隔一秒监控一次当前的音乐播放状态,如果发现与显示的状态不符,则将其修改正确。这种方法比较浪费资源,但是基本可以满足需求。所以在资源不紧张的情况下可以考虑使用。
4.在android4.4中,系统修改了远程控制音乐播放的相关api导致曾经的方法出现问题。这里简单描述一下,在4.4之前,我使用sendOrderedBroadcast的方式来发送广播,防止这个广播被多个音乐软件同时收到导致播放错乱(有的并未启动的音乐软件甚至会因为收到了这个广播而自启动)。但是在4.4后,使用有序广播则无法正常控制音乐软件,必须使用无序的放送方法才能控制。但也同时导致了上述问题。为了单一控制,我准备在广播的intent中加入目标包,即通过setPackage的方法,指定广播的发送对象。经过测试,确实可以完美解决广播控制多个音乐软件的问题。但是关键的问题来了,我如何知道当前播放音乐软件的包名。这里我将在下一篇博客“如何获取当前正在播放音乐的音乐软件的包名”中在详细讲解。
一个客户要求给网站添加一个背景音乐,我用的是html5添加网页背景音乐的代码,在此记录一下以后有用。html5方法二:<videocontrols=""autoplay=""name="media&q