使用MediaStore提供器访问存储的音频文件,将使用android.provider.MediaStore.Audio程序包。
为了使用MediaStore,需要指定想要返回的数据。可以通过使用在android.provider.MediaStore.Audio.Media类中定义的常量创建一个字符串数组来实现该操作。这些常量都是保存在MediaStore中以用于音频的标准字段。
String[] columns = { MediaStore.Audio.Media.DATA,//音频文件的实际路径 MediaStore.Audio.Media._ID,//内部ID MediaStore.Audio.Media.TITLE,//标题 MediaStore.Audio.Media.DISPLAY_NAME,//显示名称 MediaStore.Audio.Media.MIME_TYPE, MediaStore.Audio.Media.ARTIST,//艺术家 MediaStore.Audio.Media.ALBUM,//唱片集 MediaStore.Audio.Media.IS_RINGTONE, MediaStore.Audio.Media.IS_ALARM, MediaStore.Audio.Media.IS_MUSIC, MediaStore.Audio.Media.IS_NOTIFICATION};
接着通过调用managedQuery方法来查询MediaStore。managedQuery方法接受内容提供器的Uri作为参数。在当前情况下,该内容提供器是音频MediaStore,对应的Uri是android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI。这个Uri指定我们想要存储在SD卡上的音频。如果想要存储在内存中的音频文件,那么将使用android.provider.MediaStore.Audio.Media.INTERNAL_CONTENT_URI。
除了指向MediaStore的Uri,managedQuery方法还接受想返回的列数组、一条SQL WHERE子句、用于WHERE子句的值以及一条SQL ORDER BY子句。
String where = android.provider.MediaStore.Audio.Media.ALBUM + "=?"; String whereVal[] = { cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM)) }; String orderBy = android.provider.MediaStore.Audio.Media.TITLE; cursor = managedQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, columns, where, whereVal, orderBy);
managedQuery方法返回一个Cursor对象。Cursor类允许我们与从数据库查询返回的数据集交互。
要做的第一件事是创建几个变量,以保存一些想要从结果中访问的列的编号。虽然这不是必须的,但是获得索引值将会非常方便,从而不必在每次需要它们的时候调用Cursor的方法。
int fileColumn = cursor.getColumnIndex(MediaStore.Audio.Media.DATA); int mimeTypeColumn = cursor.getColumnIndex(MediaStore.Audio.Media.MIME_TYPE);
由MediaStore返回的数据在Cursor对象中可用,且通过行以及列的方式组织起来。通过调用moveToFirst方法和检索它的结果,可以获得返回的第一个结果。如果没有返回任何行,那么该方法将返回一个布尔值false,所以可将它包括在一条if语句中以确保存在数据。
为了获得实际数据,可以调用Cursor上的“getXXX”方法之一,并传入希望检索的列索引。如果数据预期是一个字符串,那么可以调用getString。如果数据预期是一个整数,那么可以调用getInt。对于所有的基本数据类型,都有一个合适的“get”方法。
String audioFilePath = cursor.getString(fileColumn); String mimeType = cursor.getString(mimeTypeColumn);
一旦获得了文件的路径和MIME类型就可以使用它们构造意图,以启动内置的音频播放器应用程序,并播放文件(也可以使用MediaPlayer直接播放文件)。为了将音频文件的路径构造成Uri,可以构造一个File对象并调用Uri.fromFile方法来获取Uri。
Intent intent = new Intent(android.content.Intent.ACTION_VIEW); File newFile = new File(audioFilePath); intent.setDataAndType(Uri.fromFile(newFile), mimeType);
以下是完整的源码示例——如何使用唱片集Uri来查询设备上的所有唱片集:
public class AudioBrowser extends ListActivity { Cursor cursor; public static int STATE_SELECT_ALBUM = 0; public static int STATE_SELECT_SONG = 1; int currentState = STATE_SELECT_ALBUM; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); String[] columns = { android.provider.MediaStore.Audio.Albums._ID, android.provider.MediaStore.Audio.Albums.ALBUM };//希望返回的唱片集的名称 cursor = managedQuery(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, columns, null, null, null); String[] displayFields = new String[] { MediaStore.Audio.Albums.ALBUM };//显示的Cursor对象中的列名 int[] displayViews = new int[] { android.R.id.text1 }; setListAdapter(new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, cursor, displayFields, displayViews));//将Cursor对象绑定到ListView对象上 } protected void onListItemClick(ListView l, View v, int position, long id) { if (currentState == STATE_SELECT_ALBUM) { //传入在列表中选定唱片集的位置,同时Cursor对象利用该位置,通过moveToPosition获知是哪个唱片集 if (cursor.moveToPosition(position)) { String[] columns = { MediaStore.Audio.Media.DATA,//音频文件的实际路径 MediaStore.Audio.Media._ID, MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.DISPLAY_NAME, MediaStore.Audio.Media.MIME_TYPE, }; String where = android.provider.MediaStore.Audio.Media.ALBUM + "=?"; //字符数组,其中每个字符串对应一个使用的“?”符号 String whereVal[] = { cursor.getString(cursor .getColumnIndex(MediaStore.Audio.Albums.ALBUM)) }; String orderBy = android.provider.MediaStore.Audio.Media.TITLE; //查询只属于特定唱片集的媒体文件 cursor = managedQuery( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, columns, where, whereVal, orderBy); String[] displayFields = new String[] { MediaStore.Audio.Media.DISPLAY_NAME }; int[] displayViews = new int[] { android.R.id.text1 }; setListAdapter(new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, cursor, displayFields, displayViews)); currentState = STATE_SELECT_SONG; } } else if (currentState == STATE_SELECT_SONG) { if (cursor.moveToPosition(position)) { int fileColumn = cursor .getColumnIndex(MediaStore.Audio.Media.DATA); int mimeTypeColumn = cursor .getColumnIndex(MediaStore.Audio.Media.MIME_TYPE); String audioFilePath = cursor.getString(fileColumn); String mimeType = cursor.getString(mimeTypeColumn); Intent intent = new Intent(android.content.Intent.ACTION_VIEW); File newFile = new File(audioFilePath); intent.setDataAndType(Uri.fromFile(newFile), mimeType); startActivity(intent); } } } }