在MediaPlayer中将数据源设置为原始ID

rus*_*oue 30 android android-mediaplayer

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

Chr*_*Zou 52

请参阅源android.media.MediaPlayer

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

您可能想要将try-catch添加到块中.

  • 非常感谢!我将其合并到以下答案中,其中包含从资源播放警报声音的完整功能:/sf/answers/3737304721/ (2认同)

Dhe*_*kar 17

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

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

  1. 使用资源名称

语法:android.resource:// [package]/[res type]/[res name]

示例: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);

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

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

像这样设置数据源:

CONSTANTS.RES_PREFIX = "android.resource://com.my.package/"
Run Code Online (Sandbox Code Playgroud)
mp.setDataSource(getApplicationContext(),
              Uri.parse(CONSTANTS.RES_PREFIX + R.raw.id));
Run Code Online (Sandbox Code Playgroud)


ste*_*ter 15

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

InputStream ins = getResources().openRawResource(R.raw.example);
Run Code Online (Sandbox Code Playgroud)

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

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

mp = MediaPlayer.create(counterstrikesb.this, R.raw.example);
Run Code Online (Sandbox Code Playgroud)

  • 文档的相关部分:"请注意,由于在此方法中自动调用`prepare()`,因此无法更改新MediaPlayer的音频流类型,音频会话ID或音频属性." (11认同)