下面对本次实验所涉及到的一些知识点进行简要的分析说明。
1、将文件PUSH到模拟器
我们的实验主题是MP3播放器,而我们一直是在使用模拟器调试,所以我们首先需要将我们的MP3音乐文件PUSH到我们的模拟器上。利用Eclipse里的DDMS,打开模拟器的File Explorer将我们的音乐文件PUSH到模拟器的SD卡上。这个过程就是要注意一个事情,文件PUSH到SD卡后文件列表是实时响应的,但是安卓里的媒体数据库貌似没有实时响应,每次都要重新启动下模拟器才有这些新的信息记录进数据库。
2、SD卡的扫描过程
在安卓系统中,往机器里添加新的媒体文件后会在系统数据库中添加一条记录,我们要做的就是扫描这个媒体数据库,然后获取到SD卡上所有的媒体信息。这个数据库的存放位置在/data/data/com.android.providers.media/databases中,我们可以把它导出来查看,或者直接在adb的命令窗口中查看,我们可以看到里面的媒体信息。
我们通过建立游标对象Cursor来实现扫描SD卡的MP3信息。在Activity中利用getContentResolver()可以得到当前应用的ContentResolver实例。然后通过该实例的query方法来得到一个Cursor对象。然后我们利用遍历这个游标对象的方式来获取到目前外部存储设备(即SD卡)上的所有媒体信息。
//获取游标对象 Cursor cursor = context.getContentResolver().query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, null); totalNum=cursor.getCount();//获取数据项个数 //以下for循环遍历游标对象,并将需要的数据存放到对应的数组对象中 for (int i = 0; i < cursor.getCount(); i++) { cursor.moveToNext(); String title = cursor.getString((cursor.getColumnIndex(MediaStore.Audio.Media.TITLE)));// 音乐标题 String uri=cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));//文件路径 totalMusicTitle.add(title); totalMusicFile.add(uri); }
3、ListView的数据绑定
ListView是一个列表项控件,在它上面显示我们的数据项需要使用到一个中间件Adapter对象,比较常用的Adapter有ArrayAdapter和SimpleAdapter,我们这里就使用了一个最简单的ArrayAdapter,这种适配器一般用户单个数据项的显示,比方我们这里只需要显示歌曲名称,那么使用ArrayAdapter<String>就够了。
按照我的理解,对ListView的分析如下:首先我们需要获取到一个数据项列表,可以是简单的字符串数组,也可以是一个复杂的对象列表,称之为数据源;然后将这个数据源分配到适配器Adapter上,由这个适配器来制定数据源的显示方式,这边又涉及到一个显示方式的layout布局,可以使用简单的系统布局,也可以自定义一个布局模式,可以称之为项呈现器,也就是ListView的列表中每一项以怎样的外观样式来呈现以及数据源中的每个字段对应到布局中的每个控件;最后我们将这个适配器分配到ListView上,那么这个ListView就能按照我们所希望的模式来显示每个数据项。
这里用了一个自定义的layout布局文件即R.layout.musicList所指向的一个XML布局文件,在这个布局文件中有个TextView,就是由R.id.tvMusicTitle所指向的控件,然后指明在该控件上显示totalMusicTitle这个ArrayList的每个Item的值ArrayAdapter<String> myAdapter=new ArrayAdapter<String>(this, R.layout.musiclist, R.id.tvMusicTitle, totalMusicTitle); lvMusic.setAdapter(myAdapter);
4、MediaPlayer类
我们这边使用MediaPlayer类来实现MP3音乐文件的播放,这个相对比较简单,这边主要了解下MediaPlayer的几个方法setDataSource、prepare、start、stop和pause等。我们可以通过查阅资料来获知MediaPlayer的生命周期和状态变化。比如播放完成会触发什么事件、prepare什么时候需要调用等。
我们在利用播放按钮控件控制MediaPlayer对象的播放时一定要注意以下几个信息:
(1)当前歌曲的索引值,即存放歌曲文件路径的ArrayList的索引值
(2)当前的播放状态,需要我们自定义个状态标记来记录当前是停止状态、播放状态还是暂停状态,然后根据该状态来确定下一步该做什么。
(3)如果需要设置播放其中的某几首,则需要加上临时数组变量,用来存放当前选中的歌曲标题信息和文件路径信息。
5、SeekBar控件
作为一个基本的进度条控件,SeekBar默认是横向的(这里用播放进度刚好需要横向,如果我们需要一个音量控制进度条呢?)SeekBar有自己的progress数值和拖拽状态(change、start和end等)。但是要让它自动跟随歌曲播放而前进则需要一个定时器来实现。同时为了实现时间码的跟随效果,我们需要计算出seekbar的进度位置等信息。
安卓第二次实验解析
最新推荐文章于 2023-06-21 22:09:17 发布