博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android music开发笔记
阅读量:7108 次
发布时间:2019-06-28

本文共 3432 字,大约阅读时间需要 11 分钟。

1.启动分析

工程目录 project/packages/apps/Music
在music的AndroidManifest.xml文件中,MusicBrowserActivity的intentfilter中定义了
“<category android:name="android.intent.category.LAUNCHER" />”

表明MusicBrowserActivity是music启动时首先调用的activity

2.音乐播放器代码结构

       Android源码的Music应用相关代码不算多,packages/apps/Music是关于UI界面的,\packages\providers\MediaProvider关于数据库的,packages/apps/MusicFX是音频效果控制面板。数据库文件放在
data/data/com.android.providers.media, 这里面有两个或更多个.db文件,external是外部数据库,记录着Music里显示的那些歌曲,internal是内部数据库,
存放着系统铃声文件。根据sd的不同,每次.db文件名字也不同,一张sd卡对应的一个文件。代码方面只有com.android.music一个包,常用的几个类如下:


      几个关于列表显示的类,下面这些类的显示都用到track_list_item_common.xml这个布局文件,充分体现最大程度复用代码的原则。

      MusicBrowserActivity.java          主控制界面

      TrackBrowserActivity.java          音乐列表界面

      PlaylistBrowserActivity.java          播放列表界面

      AlbumBrowserActivity.java     专辑浏览界面

      ArtistAlbumBrowserActivity.java          艺术家浏览界面


      这两个应该是Music应用中最重要的类了,音乐播放器吗,没播放界面怎么行。

       MediaPlaybackActivity.java          音乐播放界面

       MediaPlaybackService.java          音乐播放器服务


       下面这些都是对话框形式呈现出来的。

        RenamePlaylist.java          重命名播放列表界面

       CreatePlaylist.java          新建播放列表界面

       DeleteItems.java     删除提示框界面

       ScanningProgress.java          音乐描扫进度显示界面


       MediaAppWidgetProvider.java          Widget实现类

       MusicPicker.java          音乐选择界面,这是给其它应用程序调用的界面。

       MusicUtils.java          播放器公共方法类

      ActivityMusic.java       均衡器,音频效果控制面板

       关于音乐Music,基本的东西就这些,仅从代码量上看,这算不上一个复杂的应用。如果只是想了解应用层的功能,上面这些不会花费太久的时间。让我们在往前走一走,这些歌曲是哪来的。

3. 扫描sdcard卡读取音乐文件


       准确的说应该是媒体文件的扫描,音乐只是其中的一部分。这部分主要包括mediaScannerService,Mediaprovider和MediaScannerReceiver三个类,开机的的时候会收到ACTION_BOOT_COMPLETED消息后启动内部存储扫描工作,而收到MEDIA_MOUNT会扫描SD卡。这里只是简单的说下的流程并不深入讨论,我们重点关心扫描后在把文件信息写到数据库的那个动作。如果仔细看MediaScanner.java的代码,会发现下面这段注释,

[java]
  1. * Java MediaScannerService calls  
  2. * Java MediaScanner scanDirectories, which calls  
  3. * Java MediaScanner processDirectory (native method), which calls  
  4. native MediaScanner processDirectory, which calls  
  5. native MyMediaScannerClient scanFile, which calls  
  6. * Java MyMediaScannerClient scanFile, which calls  
  7. * Java MediaScannerClient doScanFile, which calls  
  8. * Java MediaScanner processFile (native method), which calls  
  9. native MediaScanner processFile, which calls  
  10. native parseMP3, parseMP4, parseMidi, parseOgg or parseWMA, which calls  
  11. native MyMediaScanner handleStringTag, which calls  
  12. * Java MyMediaScanner handleStringTag.  
  13. * Once MediaScanner processFile returns, an entry is inserted in to the database.  
       这个其实就是扫描的整个流程,在java与Native层反复切换,在上面第7行doScanFile方法后会有beginFile()和endFile();在endFile()方法中最后就是把扫描出来的信
  息写入数据库,需要说明的是上面的注释针对是android 2.3的,在4.0的代码中有些方法找不到了,因为google采用stagefright来替换原来的opencore,(PS:借用百度出来
结果  Opencore与stagefright两套机制,对于我们的开发而言,主要体现在parser和codec部分。
最基本的实现,二者是相同的,可以共用,差别在封装上,
opencore难度和工作量要大), 所以对于这一部分内容,如果想深入研究,不管是Opencore与stagefright,水还是挺深的。

 

 4. 如何播放音乐

      上面音乐也写到数据库了,也能列表显示,如何播放呢?
                    mMediaPlayer = new MediaPlayer();
                    mMediaPlayer.setDataSource(path);
                    mMediaPlayer.prepare();
                    mMediaPlayer.start();
       对于上层应用就是这样,new出MediaPlayer对象,设好路径,prepare()和start()就没事了,其它的都交给系统了,不过后面的事还是很多的,android的audio系统  也算比较复杂的一部分了。整个audio系统主要由负责输入AudioRecord、负责输出AudioTrack、负责混音的AudioFlinger和策略控制AudioPolicyService四个部分。
播放音乐的时候 setDataSourcet()、start()之后会在MediaPlayService的open函数创建AudioTack对象。
AudioTrack的作用是要把它的数据发给对应的设备去输出(比如蓝牙耳机或扬声器),在输出之前它需要知道要找哪个设备,根据什么呢?
根据流类型(STREAM_ALARM、STREAM_MUSIC、STREAM_RING、STREAM_SYSTEM和STREAM_VOICE_CALL)先找到对应的路由策略,这也是AudioPolicyService, AudioPolicyManagerBase存在的原因,再根据路由策略选择设备, 依据设备信息返回一个的线程索引号给
  AudioTrack作为参数CreatTrack找到AudioFlinger合适工作线程(mixerThread or DupicatiingThread)来把数据发给对应的音频输出设备。整个过程还是蛮复杂的,这里只描述了大概流程。代码里面也是故事多多,想完全掌握需要花费些时间。

参考文档:

转载于:https://www.cnblogs.com/chengliu/p/4130642.html

你可能感兴趣的文章
css调整图片位置布局
查看>>
华为的JAVA面试题及答案(部分)
查看>>
定时关机命令——shutdown
查看>>
基于Java的数据采集(三)
查看>>
【编程题目】最长公共字串
查看>>
lucene 专业名词作用整理
查看>>
win32 自定义右键菜单
查看>>
Cocos2d-x3.0TestCpp文件夹笔记(二)
查看>>
CentOS-6.5安装配置Tengine
查看>>
机器视觉之 ICP算法和RANSAC算法
查看>>
为什么GOF的23种设计模式里面没有MVC?
查看>>
[WebGL入门]十,矩阵计算和外部库
查看>>
SQL 存储过程(转帖摘录)
查看>>
网页中元素斜这显示
查看>>
JavaScipt面向对象编程----闭包
查看>>
为什么写技术博客对新人如此重要?
查看>>
Arduino 数码管LED屏驱动
查看>>
做一个略调皮的个人主页--游戏篇
查看>>
Token验证失败
查看>>
jconsole监控远程linux tomcat运行情况的配置 (转)
查看>>