通过MediaStore浏览音频

举报
ShaderJoy 发表于 2021/12/30 01:33:48 2021/12/30
【摘要】 使用MediaStore提供器访问存储的音频文件,将使用android.provider.MediaStore.Audio程序包。 为了使用MediaStore,需要指定想要返回的数据。可以通过使用在android.provider.MediaStore.Audio.Media类中定义的常量创建一个字符串数组来实现该操作。这些常量都是...

使用MediaStore提供器访问存储的音频文件,将使用android.provider.MediaStore.Audio程序包。

为了使用MediaStore,需要指定想要返回的数据。可以通过使用在android.provider.MediaStore.Audio.Media类中定义的常量创建一个字符串数组来实现该操作。这些常量都是保存在MediaStore中以用于音频的标准字段。


  
  1. String[] columns = { MediaStore.Audio.Media.DATA,//音频文件的实际路径
  2. MediaStore.Audio.Media._ID,//内部ID
  3. MediaStore.Audio.Media.TITLE,//标题
  4. MediaStore.Audio.Media.DISPLAY_NAME,//显示名称
  5. MediaStore.Audio.Media.MIME_TYPE,
  6. MediaStore.Audio.Media.ARTIST,//艺术家
  7. MediaStore.Audio.Media.ALBUM,//唱片集
  8. MediaStore.Audio.Media.IS_RINGTONE,
  9. MediaStore.Audio.Media.IS_ALARM,
  10. MediaStore.Audio.Media.IS_MUSIC,
  11. MediaStore.Audio.Media.IS_NOTIFICATION};

除了指向MediaStore的Uri,managedQuery方法还接受想返回的列数组、一条SQL WHERE子句、用于WHERE子句的值以及一条SQL ORDER BY子句。


  
  1. String where = android.provider.MediaStore.Audio.Media.ALBUM
  2. + "=?";
  3. String whereVal[] = { cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM)) };
  4. String orderBy = android.provider.MediaStore.Audio.Media.TITLE;
  5. cursor = managedQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, columns, where, whereVal, orderBy);

要做的第一件事是创建几个变量,以保存一些想要从结果中访问的列的编号。虽然这不是必须的,但是获得索引值将会非常方便,从而不必在每次需要它们的时候调用Cursor的方法。


  
  1. int fileColumn = cursor.getColumnIndex(MediaStore.Audio.Media.DATA);
  2. int mimeTypeColumn = cursor.getColumnIndex(MediaStore.Audio.Media.MIME_TYPE);

为了获得实际数据,可以调用Cursor上的“getXXX”方法之一,并传入希望检索的列索引。如果数据预期是一个字符串,那么可以调用getString。如果数据预期是一个整数,那么可以调用getInt。对于所有的基本数据类型,都有一个合适的“get”方法。


  
  1. String audioFilePath = cursor.getString(fileColumn);
  2. String mimeType = cursor.getString(mimeTypeColumn);

  
  1. Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
  2. File newFile = new File(audioFilePath);
  3. intent.setDataAndType(Uri.fromFile(newFile), mimeType);


  
  1. public class AudioBrowser extends ListActivity {
  2. Cursor cursor;
  3. public static int STATE_SELECT_ALBUM = 0;
  4. public static int STATE_SELECT_SONG = 1;
  5. int currentState = STATE_SELECT_ALBUM;
  6. @Override
  7. public void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.main);
  10. String[] columns = { android.provider.MediaStore.Audio.Albums._ID,
  11. android.provider.MediaStore.Audio.Albums.ALBUM };//希望返回的唱片集的名称
  12. cursor = managedQuery(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,
  13. columns, null, null, null);
  14. String[] displayFields = new String[] { MediaStore.Audio.Albums.ALBUM };//显示的Cursor对象中的列名
  15. int[] displayViews = new int[] { android.R.id.text1 };
  16. setListAdapter(new SimpleCursorAdapter(this,
  17. android.R.layout.simple_list_item_1, cursor, displayFields,
  18. displayViews));//将Cursor对象绑定到ListView对象上
  19. }
  20. protected void onListItemClick(ListView l, View v, int position, long id) {
  21. if (currentState == STATE_SELECT_ALBUM) {
  22. //传入在列表中选定唱片集的位置,同时Cursor对象利用该位置,通过moveToPosition获知是哪个唱片集
  23. if (cursor.moveToPosition(position)) {
  24. String[] columns = { MediaStore.Audio.Media.DATA,//音频文件的实际路径
  25. MediaStore.Audio.Media._ID,
  26. MediaStore.Audio.Media.TITLE,
  27. MediaStore.Audio.Media.DISPLAY_NAME,
  28. MediaStore.Audio.Media.MIME_TYPE,
  29. };
  30. String where = android.provider.MediaStore.Audio.Media.ALBUM
  31. + "=?";
  32. //字符数组,其中每个字符串对应一个使用的“?”符号
  33. String whereVal[] = { cursor.getString(cursor
  34. .getColumnIndex(MediaStore.Audio.Albums.ALBUM)) };
  35. String orderBy = android.provider.MediaStore.Audio.Media.TITLE;
  36. //查询只属于特定唱片集的媒体文件
  37. cursor = managedQuery(
  38. MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, columns,
  39. where, whereVal, orderBy);
  40. String[] displayFields = new String[] { MediaStore.Audio.Media.DISPLAY_NAME };
  41. int[] displayViews = new int[] { android.R.id.text1 };
  42. setListAdapter(new SimpleCursorAdapter(this,
  43. android.R.layout.simple_list_item_1, cursor,
  44. displayFields, displayViews));
  45. currentState = STATE_SELECT_SONG;
  46. }
  47. } else if (currentState == STATE_SELECT_SONG) {
  48. if (cursor.moveToPosition(position)) {
  49. int fileColumn = cursor
  50. .getColumnIndex(MediaStore.Audio.Media.DATA);
  51. int mimeTypeColumn = cursor
  52. .getColumnIndex(MediaStore.Audio.Media.MIME_TYPE);
  53. String audioFilePath = cursor.getString(fileColumn);
  54. String mimeType = cursor.getString(mimeTypeColumn);
  55. Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
  56. File newFile = new File(audioFilePath);
  57. intent.setDataAndType(Uri.fromFile(newFile), mimeType);
  58. startActivity(intent);
  59. }
  60. }
  61. }
  62. }







文章来源: panda1234lee.blog.csdn.net,作者:panda1234lee,版权归原作者所有,如需转载,请联系作者。

原文链接:panda1234lee.blog.csdn.net/article/details/8762534

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。