本文转自:http://www.poemcode.net/2009/11/android_music/
Android 1.6的源码共包括了21个核心应用,分布在 package/apps下,其中 Music 应用提供了音乐播放功能,在各
GPhone 中差不多都能看到。但是这些核心应用本不属于 Framework,因此无法在 SDK Document
中看到其类和方法的说明,更无法在外部引入它们的类,Music也不例外。
工作中遇到这么一个应用场景:用户在文档阅读的 Activity 中,要能够控制音乐播放,包括:上一首、下一首、暂停和继续,以及获取正在播放的音乐的名称。由于无法引入 Music 应用的类,自然也就无法通过 API 直接实现这些功能。
查遍了 Dev Guide 和 Reference,也没有找到蛛丝马迹,于是索性直接进入到 Music
的源码探个究竟。经过初步的分析,将问题的焦点定位在 com.android.music.MediaPlaybackService 上,该类是个
Service 类,负责在后台播放音乐等工作。
该类声明并实例化了一个 BroadcastReceiver,并在 onCreate 中进行了注册,那么这个 BroadcastReceiver 到底接收哪些 Intent 呢?通过代码可以一目了然:
IntentFilter commandFilter =
new
IntentFilter(
)
;
commandFilter.addAction
(
SERVICECMD)
;
commandFilter.addAction
(
TOGGLEPAUSE_ACTION)
;
commandFilter.addAction
(
PAUSE_ACTION)
;
commandFilter.addAction
(
NEXT_ACTION)
;
commandFilter.addAction
(
PREVIOUS_ACTION)
;
registerReceiver(
mIntentReceiver, commandFilter)
;
找到上述代码中的常量声明,可以看出这些就是控制音乐播放的action name了。
public
static
final
String
SERVICECMD =
“com.android
.music
.musicservicecommand
”;
public
static
final
String
CMDNAME =
“command”;
public
static
final
String
CMDTOGGLEPAUSE =
“togglepause”;
public
static
final
String
CMDSTOP =
“stop”;
public
static
final
String
CMDPAUSE =
“pause”;
public
static
final
String
CMDPREVIOUS =
“previous”;
public
static
final
String
CMDNEXT =
“next”;
public
static
final
String
TOGGLEPAUSE_ACTION =
“com.android
.music
.musicservicecommand
.togglepause
”;
public
static
final
String
PAUSE_ACTION =
“com.android
.music
.musicservicecommand
.pause
”;
public
static
final
String
PREVIOUS_ACTION =
“com.android
.music
.musicservicecommand
.previous
”;
public
static
final
String
NEXT_ACTION =
“com.android
.music
.musicservicecommand
.next
”;
然后再回过头来看 BroadcastReceiver是如何处理这些 Intent 的,通过其 onCreate
方法可以看出控制音乐播放有两种方式。其一是设置 action name 为 SERVICECMD,然后通过 Intent 的 extra 设置
command,其值可以是 CMDTOGGLEPAUSE、CMDSTOP、CMDPAUSE、CMDPREVIOUS 或 CMDNEXT。
其二是设置 action name 为 TOGGLEPAUSE_ACTION、PAUSE_ACTION、PREVIOUS_ACTION 或 NEXT_ACTION。
看起来第二种方式更简洁,依此思路,逆向操作也就可以解决起初的问题了,如下代码演示了如何控制下一首:
Intent intent =
new
Intent (
”com.android
.music
.musicservicecommand
.next
”)
;
sendBroadcast(
intent)
;
如果我们在此基础上更深入一步,控制音乐播放的同时,我们还需要得到正在播放的音乐名称,这又该怎么实现呢?
Android Framework 提供了非常棒的 android.media,凡音乐播放都离不开 MediaPlayer,该类定义了七个内部类,其中 MediaPlayer.OnPreparedListener 是这么描述的:
Interface definition for a callback to be invoked when the media source is ready for playback.
媒体文件准备结束,准备播放时,Android 就会调用这个这个内部类,在 MediaPlaybackService 则是 notifyChange(String what) 方法进行处理:
private
void
notifyChange(
String
what)
{
Intent i =
new
Intent(
what)
;
i.putExtra
(
”id”, Integer
.valueOf
(
getAudioId(
)
)
)
;
i.putExtra
(
”artist”, getArtistName(
)
)
;
i.putExtra
(
”album”,getAlbumName(
)
)
;
i.putExtra
(
”track”, getTrackName(
)
)
;
sendBroadcast(
i)
;
// ……
}
那么在我们的应用当中,则需要创建 一个BroadcastReceiver,过滤对应的 action name,也就是常量 META_CHANGED 对应的值即可达到目标。
到了这里,回顾一下解决问题的过程,不由让人有些愤愤不平,为什么 Android 不把接口以文档的形式公布于众呢?真是“犹抱琵琶半遮面”。–或者它有公布,我没有看到?
分享到:
相关推荐
B3850 [GESP202306 四级] 幸运数2
python模块onnxruntime版本
3063 - Heartlake Flying Club
AUTOSAR_SWS_SAEJ1939DiagnosticCommunicationManager.pdf
AUTOSAR_SWS_MemoryAbstractionInterface.pdf
lrs
B3850 [GESP202306 四级] 幸运数
【硬件开发】说明:485硬件开发时对485硬件模块参考硬件特性 【硬件开发】说明:485硬件开发时对485硬件模块参考硬件特性
Java毕业设计-ssm基于微信平台的校园汉服租赁系统的设计与实现演示录像(高分期末大作业)
别墅图纸编号D068-两层-13.50&14.10米- 施工图-施工说明.dwg
491A111E-B58E-48F4-8342-995B397B4D37-289-00000201845230F5.mov
python模块onnxruntime版本
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
整数方阵外围数字的和
4837 - Mini Trains - Steam Train
计算机网络试卷资源及解析
onnxruntime-1.7.1-cp38-cp38-linux_armv7l.whl.zip
B2030 计算线段长度
本智能物流管理系统有管理员,顾客,员工,店主。功能有个人中心,顾客管理,员工管理,店主管理,门店信息管理,门店员工管理,部门分类管理,订单信息管理,工作日志管理。因而具有一定的实用性。 本站是一个B/S模式系统,采用SSM框架,MYSQL数据库设计开发,充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得智能物流管理系统管理工作系统化、规范化。本系统的使用使管理人员从繁重的工作中解脱出来,实现无纸化办公,能够有效的提高智能物流管理系统管理效率。 关键词:智能物流管理系统;SSM框架;MYSQL数据库;Spring Boot 管理员模块的实现: 顾客信息管理:智能物流管理系统的系统管理员可以管理顾客信息,可以对顾客信息信息添加修改删除以及查询操作 员工信息管理:系统管理员可以查看对员工信息信息进行添加,修改,删除以及查询操作。 店主模块的实现: 员工信息管理:店主可以对员工信息信息进行修改,删除以及查询操作 门店信息管理:店主可以对门店信息信息进行修改操作,还可以对门店信息信息进行查询。 员工模块的实现: 门店信息管理:员工登录可以查看门店信息 订单信息管理
7140 - X-Wing Fighter.mpd