摘要:《深入浅出Google Android》第9章为有源头话水来——使用SQLite、ContentProvider与Preferences处理数据,这一章我们将来认识Android平台是如何对数据进行处理的。包括文件I/O操作,如何在程序中实现数据库相关的操作,以及如何使用Preferences来存取数据。本节为大家介绍让TinyPlayer播放本地音乐文件1。
标签:TinyPlayer Google Android 深入浅出Google Android
Oracle帮您准确洞察各个物流环节
9.5 让TinyPlayer播放本地音乐文件1
本节将实现用一个ListView显示存储卡内所有的音乐,并且可通过长按进行播放。在播放一首音乐的同时,也将更新音轨信息。有关如何在模拟器中虚拟SD卡的内容请参考附录C。
首先重构用户界面,将原有的用户界面装进一个垂直的LinearLayout中,并在其下面添加一个ListView来显示存储卡上的音乐。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout android:id="@+id/ctrlandinfo" android:orientation="horizontal" ... <ListView android:id="@+id/audiolist" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout> 然后实现功能部分,编辑TinyPlayer.java,添加如下字段。 ListView audioList; ContentResolver resolver; TextView title; TextView artist; TextView album; SharedPreferences sp; final static String PREF = "NOW_PLAYING"; final static String URI_KEY = "uri"; 在onCreate()方法中,对这些字段进行赋值,并注释掉给nowPlaying赋值的语句。我们将直接读取上一次播放音乐的URI信息,或者动态地根据用户操作更新当前播放的URI。
title = (TextView)findViewById(R.id.tracktitle); artist = (TextView)findViewById(R.id.trackartist); album = (TextView)findViewById(R.id.trackalbum); audioList = (ListView)findViewById(R.id.audiolist); resolver = getContentResolver(); /*设置当前播放的Uri*/ //nowPlaying = Uri.parse("http://www.5billion.com.cn/music.mp3"); //读取上一次播放的Uri sp = getSharedPreferences(PREF, 0); String uriString = sp.getString(URI_KEY, null); if (uriString == null) { nowPlaying = null; } else { nowPlaying = Uri.parse(uriString); } 每一次应用程序退出时,需要保存当前播放音乐的URI,将以下代码添加到onDestroy()方法中。
@Override public void onDestroy() { ... SharedPreferences.Editor editor = sp.edit(); editor.putString(URI_KEY,nowPlaying.toString()); editor.commit(); super.onDestroy(); } 还是在onCreate()方法的实现中,对SD卡内的音频文件进行查询并返回包含所有音频文件信息的Cursor,然后利用CursorAdapter填充audioList。
Cursor c = resolver.query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, null); CursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2,c, new String[] {MediaStore.Audio.AudioColumns.TITLE, MediaStore.Audio.AudioColumns.ARTIST}, new int[] {android.R.id.text1,android.R.id.text2}); audioList.setAdapter(adapter); 在Android平台中,所有的音/视频文件的相关信息都是以Content的形式提供给开发者的,这里用到了静态常量MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,它表示主外部存储器(即SD卡)内的所有音频文件的索引数据库的content://样式的URI。
为了处理用户长按事件以播放所选音频,还要为audioList设置一个长按事件的监听器。
audioList.setOnItemLongClickListener(new OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int pos, long id) { nowPlaying = Uri.withAppendedPath( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, "/"+String.valueOf(id)); Intent i = new Intent(MusicPlayService.MUSIC_CONTROL); i.setData(nowPlaying); i.putExtra("cmd",MusicPlayService.CMD_PLAY); sendBroadcast(i); return true; } });0 现在就可以看到SD卡内的音频文件信息显示在ListView上了,但却还不能通过长按来播放所选音频,其原因是,在MediaPlayService中还没有为其注册对应IntentFilter的Broadcast-Receiver。因此,还要修改MediaPlayService.java中注册CommandReceiver的语句,由于这里没有用到HTTP的结构,所以就直接对这个IntentFilter进行修改。
IntentFilter filter1 = new IntentFilter(); filter1.addAction(MUSIC_CONTROL); //filter1.addDataScheme("http"); try { filter1.addDataScheme("content"); filter1.addDataType("audio/*"); } catch (MalformedMimeTypeException e) { e.printStackTrace(); } registerReceiver(doCommand, filter1); 经过这样注册后,长按audioList的某一项后就可以对该音频进行播放了。剩下的就是显示更新音轨信息了。先在TinyPlayer.java中的内部类updateReceiver里定义一个更新音轨信息的方法updateTrackInfo()。
/*更新音轨信息*/ public void updateTrackInfo() { Cursor c = resolver.query(nowPlaying,null,null,null,null); int titleIndex = c.getColumnIndex(MediaStore.Audio.AudioColumns.TITLE); int artistIndex = c.getColumnIndex(MediaStore.Audio.AudioColumns.ARTIST); int albumIndex = c.getColumnIndex(MediaStore.Audio.AudioColumns.ALBUM); if (c.getCount() != 0) { c.moveToFirst(); title.setText(c.getString(titleIndex)); artist.setText(c.getString(artistIndex)); album.setText(c.getString(albumIndex)); } } 然后在更新到PLAYING状态时,调用此方法就可以每次播放时更新音轨信息了。最后TinyPlayer的效果如图9-11所示。至此,我们整个TinyPlayer的例子也就告一段落了。接下来读者可以自己练习,继续完善TinyPlayer的功能,如前进、后退、下一首、上一首、播放列表以及在后台播放时显示Notification等功能。
case MusicPlayService.STATUS_PLAYING: playPauseBtn.setImageResource(R.drawable.pauseselector); updateTrackInfo(); break; ...
分享到:
相关推荐
TinyPlayer可能利用了MediaPlayer类进行音频播放,这个类支持本地和网络流媒体,可以控制播放、暂停、停止和音量等。 3. **MP3解码**: MP3是一种广泛使用的音频格式,TinyPlayer作为MP3播放器,需要支持MP3解码。这...
tinyplayer 源码中service部分
tinyplayer android mp3player 源码
3. **文件操作**:为了读取和保存播放列表或者音乐文件,需要熟悉C++的文件流(fstream)库来处理文件输入输出。 4. **多线程**:如果tinyplayer支持后台加载或同时处理多个任务,可能需要用到C++11及更高版本的多...
4. **播放列表功能**:TinyPlayer具备播放列表功能,这意味着它可以存储多个音频文件,并按照一定的顺序进行播放。这通常涉及到数组数据结构来管理歌曲列表,以及遍历和操作这些数据的方法。 5. **SoundCloud API...
1. **媒体库管理**:这是音乐播放器的核心部分,用于读取、管理和组织设备上的音频文件。在Android中,我们可以使用`MediaStore`类来访问设备的音频库,获取歌曲信息,如歌手、专辑、时长等。 2. **播放控制**:这...
7. **文件操作**:如果播放本地音乐,需要对文件系统有基本了解。Android提供了File类和ContentResolver接口来读取和操作本地文件,例如获取SD卡上的音乐文件。 8. **权限管理**:Android 6.0及以上版本引入了运行...
#### 9.5 让 TinyPlayer 播放本地音乐 这一节可能会涉及如何使用Android的媒体播放API来播放本地音乐文件。通常会涉及到`MediaPlayer`类的使用。 #### 9.6 小结 本章介绍了Android中数据处理的基本方式,包括文件...
- 文件选择器:允许用户从设备上选择要播放的音乐文件,可能需要用到Intent的ACTION_PICK或者ACTION_GET_CONTENT。 - 音频焦点管理:在Android中,多个应用可能同时试图播放音频,因此需要处理音频焦点,确保只有一...
【Android_MusicPlayer】是一个基于Android平台的简易音乐播放器项目,主要针对初学者或有一定基础的开发者,用于学习和实践Android应用开发中的媒体播放功能。这个项目涉及到的知识点广泛,包括Android SDK的使用、...
android音乐播放器,有播放功能,可以从sdcard/mp3文件夹中读取相应的mp3文件,可以点击menu键来更换背景
使用 DirectShow 技术的音频、视频和 CD/DVD 播放器。 它可以读取(但不能修改)ID3/Ogg/APE/WMA 标签并显示 sub/srt/aqt/dks 字幕。 CD 信息可以从 freedb、CD-TEXT 或 cdplayer.ini 中获取并提交给 freedb。