37

在 MediaPlayer.create 方法中,可以使用原始文件的 id,但如何在 setDataSource 方法中使用它?

4

3 回答 3

62

参考源码android.media.MediaPlayer

AssetFileDescriptor afd = context.getResources().openRawResourceFd(resid);
if (afd == null) return;
mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
afd.close();

您可能希望将 try-catch 添加到块中。

于 2013-11-21T02:24:46.510 回答
20

在此处解释@Kartik 的答案获取存储在 android 的 res/raw 文件夹中的 .mp3 文件的 URI

如果您想获取任何资源 URI,那么有两种方法:

  1. 使用资源名称

语法:android.resource://[包]/[资源类型]/[资源名称]

示例:Uri.parse("android.resource://com.my.package/drawable/icon");

  1. 使用资源 ID

语法:android.resource://[package]/[resource_id]

示例:Uri.parse("android.resource://com.my.package/" + R.drawable.icon);

这些是获取存储在可绘制文件夹中的任何图像文件的 URI 的示例。同样,您可以获得 res/raw 文件夹的 URI。

IMO 第二种方式将是首选,因为重命名资源等可以很容易地重构。

像这样设置数据源:

CONSTANTS.RES_PREFIX = "android.resource://com.my.package/"
mp.setDataSource(getApplicationContext(),
              Uri.parse(CONSTANTS.RES_PREFIX + R.raw.id));
于 2013-01-11T15:29:37.337 回答
16

您可以将原始音频加载到输入流中,然后像普通流一样将其加载到 MediaPlayer 中:

InputStream ins = getResources().openRawResource(R.raw.example);

然后按照像pocketjourney这样的流媒体教程

但这太复杂了,因为你可以打电话

mp = MediaPlayer.create(counterstrikesb.this, R.raw.example);
于 2010-04-14T14:06:46.227 回答