通过MediaStore浏览音频

简介: 通过MediaStore浏览音频

使用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);
      }
    }
  }
}
目录
相关文章
iframe 在线预览pdf、word、excel、ppt、txt、图片、视频
iframe 在线预览pdf、word、excel、ppt、txt、图片、视频
|
关系型数据库 数据安全/隐私保护 PostgreSQL
Windows环境下安装PostgreSQL
Windows环境下安装PostgreSQL
855 0
|
存储 关系型数据库 数据库
Windows安装Postgresql之解压版
Windows安装Postgresql之解压版
1481 0
|
5G 数据处理 UED
超密集网络UDN的核心特点 | 带你读《5G UDN(超密集网络)技术详解》之一
本书全面深入地阐述了 UDN 技术的发展历史、当今的现状及未来趋势,内容 涵盖上层业务应用、部署组网、系统架构、无线接入侧高层和物理层关键技术等方 面。本书从 5G 移动业界大背景为切入点,紧密结合了当前 5G 在 3GPP 的标准化 进展,系统化地梳理和诠释了 5G UDN 的诸多相关技术,从宏观到微观,从高层 到低层。通过本书,读者不仅可以全面丰富地了解目前 5G 在 3GPP 的标准化状况 和未来趋势,系统化地学习 UDN 技术体系的相关知识,还可以体察标准制定背后 的诸多缘由和规律。
超密集网络UDN的核心特点 | 带你读《5G UDN(超密集网络)技术详解》之一
|
4月前
|
数据采集 算法 API
2025 电商 API 接口全解析:从接入到实战的通用指南
本文系统解析了电商 API 的核心价值、分类及 2025 年最新趋势,涵盖商品、订单、支付、用户四大模块。内容包括 API 接入的通用前置准备、核心场景实战案例及避坑策略,强调合规性、实时性与智能化应用。适用于企业及开发者高效对接主流电商平台。
|
对象存储 数据库
2026年 | 1月云大使推广奖励规则
云大使推广返利活动,企业新用户下单返佣加码5%,推广最高返佣45%,新老用户都可参与返利活动。推广百炼大模型产品额外奖励20元/单快来报名参加吧。
103398 53
2026年 | 1月云大使推广奖励规则
|
7月前
|
JSON API Go
开箱即用的 GoWind Admin|风行,企业级前后端一体中后台框架:集成 Swagger UI 打造交互式 API 文档
GoWind Admin(风行)是基于 Kratos 的企业级中后台框架,集成 Swagger UI 实现交互式 API 文档。通过 Protobuf 自动生成 OpenAPI v3 规范文档,利用 `//go:embed` 嵌入服务,一键部署可视化调试界面,提升前后端协作效率,开箱即用。
436 1
开箱即用的 GoWind Admin|风行,企业级前后端一体中后台框架:集成 Swagger UI 打造交互式 API 文档
|
弹性计算 运维 Shell
统计双色球各个数字的中奖概率
【4月更文挑战第29天】
779 1
|
前端开发 UED 开发者
【Flutter前端技术开发专栏】Flutter中的列表与滚动视图优化
【4月更文挑战第30天】Flutter开发中,优化列表和滚动视图至关重要。本文介绍了几种优化方法:1) 使用`ListView.builder`和`GridView.builder`实现懒加载;2) 复用子组件以减少实例创建;3) 利用`CustomScrollView`和`Slivers`提升滚动性能;4) 通过`NotificationListener`监听滚动事件;5) 使用`KeepAlive`保持列表项状态。掌握这些技巧能提升应用性能和用户体验。
373 1
【Flutter前端技术开发专栏】Flutter中的列表与滚动视图优化

热门文章

最新文章