Android 在MediaPlayer中将数据源设置为原始ID
在MediaPlayer.create方法中,可以使用原始文件的id,但在setDataSource方法中如何使用该id?您可以将原始音频加载到输入流中,并将其加载到MediaPlayer中,就像加载到普通流中一样:Android 在MediaPlayer中将数据源设置为原始ID,android,android-mediaplayer,Android,Android Mediaplayer,在MediaPlayer.create方法中,可以使用原始文件的id,但在setDataSource方法中如何使用该id?您可以将原始音频加载到输入流中,并将其加载到MediaPlayer中,就像加载到普通流中一样: InputStream ins = getResources().openRawResource(R.raw.example); 然后遵循流媒体教程,如 但这太复杂了,你可以直接打电话 mp = MediaPlayer.create(counterstrikesb.this, R
InputStream ins = getResources().openRawResource(R.raw.example);
然后遵循流媒体教程,如
但这太复杂了,你可以直接打电话
mp = MediaPlayer.create(counterstrikesb.this, R.raw.example);
在这里解释@Kartik的答案 如果要获取任何资源URI,有两种方法:
您可能需要将try-catch添加到块中。文档的相关部分:“请注意,由于此方法自动调用
prepare()
,因此您无法更改新MediaPlayer的音频流类型、音频会话ID或音频属性。”答案中PocketTravely的链接已失效。此答案无法回答OP的实际问题:您无法在setDataSource中设置输入流…非常感谢!我将这一点纳入了下面的答案中,其中包含了从资源中播放警报声音的完整功能:为什么要在之后立即调用afd.close()
?这难道不会使描述符无效,因此无法使用吗???
CONSTANTS.RES_PREFIX = "android.resource://com.my.package/"
mp.setDataSource(getApplicationContext(),
Uri.parse(CONSTANTS.RES_PREFIX + R.raw.id));
AssetFileDescriptor afd = context.getResources().openRawResourceFd(resid);
if (afd == null) return;
mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
afd.close();