Android - 将 URI 转换为棒棒糖上的文件路径

2023-12-05

我目前正在尝试制作一个音频媒体播放器。我目前正在运行棒棒糖。我在设置媒体播放器的数据源时遇到问题。首先,这是我设置数据源的方法:

public void playSong() {
    player.reset();
    Song selSong = songs.get(songPos);
    long currSong = selSong.getId();
    //Get Uri of song
    Uri trackUri = ContentUris.withAppendedId(
            MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, currSong);
    try {
        //Tell the player the song to play
        player.setDataSource(getApplicationContext(), trackUri);
    } catch (Exception e) {
        Log.e("MUSIC SERVICE", "Error setting data source", e);
        Log.d("URI Path", trackUri.toString());
    }

    //Will prepare the song and call onPrepare of player
    player.prepareAsync();
}

Uri 的结果是这样的:

内容://媒体/外部/音频/媒体/22

我做了一些研究,据我了解,在 Android 4.1 之后,您不能再使用 URI 作为数据源。当我使用上面的代码运行这个应用程序时,我会收到以下错误:

E/MediaPlayer﹕ Unable to create media player
E/MUSIC SERVICE﹕ Error setting data source
    java.io.IOException: setDataSource failed.: status=0x80000000
            at android.media.MediaPlayer.nativeSetDataSource(Native Method)

所以现在我需要将 URI 转换为文件路径并将其作为数据源提供。而且,经过更多研究,kitkat 似乎改变了 URI 的提供方式,因此很难从 URI 获取文件路径。但是,我不确定此更改是否持续到 Android Lollipop 5.0.2 中。

本质上,我有一首歌曲的 URI,但我需要向数据源提供 URI 以外的其他内容。有什么方法可以转换 Lollipop 上的 URI,如果没有,我如何提供只知道歌曲 id 的数据源?谢谢。


Lollipop 决定学习另一门课程,从系统获取文件。 (有人说是来自KitKat,但我在KitKat上还没有遇到过)。下面的代码是获取棒棒糖上的文件路径

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && isMediaDocument(uri))
    {
        final String docId = DocumentsContract.getDocumentId(uri);
        final String[] split = docId.split(":");
        final String type = split[0];

        Uri contentUri = null;
        if ("audio".equals(type)) 
        {
            contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
        }

        final String selection = "_id=?";
        final String[] selectionArgs = new String[] {
                split[1]
        };

        String filePath = getDataColumn(context, contentUri, selection, selectionArgs);
    }

是媒体文档:

public static boolean isMediaDocument(Uri uri)
{
    return "com.android.providers.media.documents".equals(uri.getAuthority());
}

获取数据列:

private static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs)
{
    Cursor cursor = null;
    final String column = "_data";
    final String[] projection = {
            column
    };

    try {
        cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
        if (cursor != null && cursor.moveToFirst())
        {
            final int column_index = cursor.getColumnIndexOrThrow(column);
            return cursor.getString(column_index);
        }
    } finally {
        if (cursor != null)
            cursor.close();
    }
    return null;
}

如果您还有问题,this是检查图像、音频、视频、文件等的完整答案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android - 将 URI 转换为棒棒糖上的文件路径 的相关文章

随机推荐

  • 负数和正数的正则表达式

    我需要一个输入字段的正则表达式 以允许负数和正数 并且不允许字母 特殊字符 我见过其他人实现了这一点 但他们允许在字符串中的任何位置使用减号 而我只想允许在字符串的开头使用减号 注意 我想允许用户使用箭头 del home 键等 这是获取正
  • 如何在 SSRS 2008 R2 中将图表的宽度与 Tablix 的宽度对齐?或者如何使用 DynamicWidth 属性?

    我正在创建 SSRS 报告 该报告由 tablix 和图表组成 两者都描述相同的数据 即相同的数据库查询 Tablix 的实际列数由查询返回的行数动态决定 我们以按列的方式显示记录 Example 如果查询返回 5 条记录 则 Tablix
  • 如何将缓存清单添加到 Meteor 应用程序?

    嗯 添加就没有问题了 但是如何生成缓存清单呢 我需要以某种方式获取 Meteor 生成的 CSS 和 JS 组合的路径 http www whatwg org specs web apps current work manifests Up
  • 查找左上角和右下角点 (C++)

    我正在为我正在进行的项目寻求帮助 我正在做的是多边形近似算法 我已经获得了边界的所有点 但为了启动算法 我需要从点集中找到左上角和右下角的点 所有点都存储在一个结构体数组中 其中包含每个点的 x 和 y 坐标 关于循环点数组的简单方法有什么
  • 如何在Android中的.csv文件中逐行写入contactname和contactno?

    我想从手机中获取联系人姓名和相应的联系人号码 并将其写入 csv文件 每行将包含整个联系人列表中每个人的联系人姓名和联系电话号码 联系方式怎么写 csv file 我编写了用于显示联系人姓名列的代码 但它仅显示一个联系人 这意味着它会覆盖现
  • 如何将 Map 对象写入文件

    我想从 a 写入文件Map目的 这是我的尝试 try stuMap put student getId student Path file Paths get student txt to create the file Files wri
  • MASM x64 中的跳转表实现?

    我正在尝试使用跳转表在汇编 MASM64 Windows x64 中实现算法 基本思想是 我需要对数据执行 3 种不同类型的操作 这些操作取决于一些变量 但我发现实现大量切换和许多冗长的实现很乏味 PUBLIC superFunc 40 v
  • JTidy java API 将 HTML 转换为 XHTML

    我正在使用 JTidy 从 HTML 转换为 XHTML 但我在我的 XHTML 文件中发现了这个标签 nbsp 我可以阻止它吗 这是我的代码 from html to xhtml try fis new FileInputStream h
  • 如何将 DatagridView 保存在 Xml 中并将 Xml 加载到 datagridView?

    您好 我想将数据从 datagridview 保存并加载到 xml 我的想法是 我可以将我的 datagridview 保存到 xml 中 gt date name xml 然后我可以加载此数据 对于这两个操作我想使用两种方法 gt Sav
  • 如何以编程方式在 C++ 或 Python 中列出 DLL 的依赖项?

    我目前正在使用 Boost Python 为 C 项目编写 Python 接口 问题是 如果缺少 DLL Python 会给我们一条非常无用的错误消息 ImportError DLL 加载失败 找不到指定的模块 根据这个网站不可能显示比这更
  • Prestashop 1.6 获取模块类的实例

    我有一个被重写的类OrderConfirmationControllerCore 我有一个带有类的模块Abra 我需要获取一个实例Abra类在OrderConfirmationControllerCore 我的代码是 class Order
  • PostSharp 参数验证 - 使用 RegularExpressionAttribute 查找前导/尾随空格

    我正在使用 PostSharp 3 1 通过验证属性来验证属性的参数 我想用正则表达式属性执行验证 它接受表示正则表达式的字符串 如果字符串有任何前导或尾随空格 但字符串可能在单词之间包含空格 我想抛出异常 在使用 PostSharp 属性
  • 反序列化 JSON 子文档

    我正在调用 JIRA Rest API 来接收工作日志对象列表 我收到的 JSON 看起来像 startAt 0 maxResults 1 total 1 worklogs self http www example com jira re
  • 有没有办法使用 LINQ 表达式填充集合?

    LINQ 的优点之一是允许您获取与集合相关的信息 而无需手动编写代码来迭代集合 有没有办法使用 LINQ 填充集合 从而避免编写循环 例如 假设我有以下代码 它适用于从 1 到 10 的数字范围 public static void Lin
  • 在 WPF 应用程序中使用 .NET Standard 程序集中的内容文件

    我想将文件嵌入到 NET Standard 程序集中 并在 WPF 应用程序的 XAML 中使用它 如果您将构建操作设置为Resource在其他程序集中使用嵌入文件非常容易 但是您必须使用
  • 在 Angular (v5) 中,如何监听我的应用程序 Redux 状态对象的变化?

    我需要知道如何创建一个监听器 例如我想订阅 AppState 更改 以下是我目前非常基本的服务 我在视图上有一个调度操作 它会增加计数器 一旦计数器改变值 我想在我网站的其他部分检测到这一点 例如例如全局标头 我正在使用 ng2 Redux
  • 将光标设置到 CKEditor 中的特定位置

    有没有办法将光标位置设置为 CKEditor 内的已知索引 我想这样做是因为当我更改编辑器内的 html 时 它会将光标重置到插入元素的开头 这是一个问题 因为我在用户键入时动态更改内容 如果我知道我想将光标设置回编辑器内的已知字符位置 例
  • 尝试获取本周星期一的日期

    我已经实现了一种方法来获取本周星期一的日期 并且我已将星期一指定为本周的第一天 但是 无论我做什么 它都会返回 Sun Mar 24 15 03 07 GMT 2013 我看不出这里有什么问题 有人可以帮忙吗 public static D
  • 使用自定义顺序和包含逗号的值编写 Excel VBA 排序代码

    在 VBA 中 Excel 允许使用 CustomOrder 参数对值进行排序 以选择排序的序列项 不幸的是 项目序列是用逗号分隔的 并且我的排序项目之一包含逗号 例如 我想按第二列中的类别对第一列中的数据进行排序 空中 陆地或海上 类别包
  • Android - 将 URI 转换为棒棒糖上的文件路径

    我目前正在尝试制作一个音频媒体播放器 我目前正在运行棒棒糖 我在设置媒体播放器的数据源时遇到问题 首先 这是我设置数据源的方法 public void playSong player reset Song selSong songs get