android - 使用 Android mediaPlayer 播放原始文件夹中的文件,使用其 resourceId

标签 android android-mediaplayer

在 Android 中,我可以使用 MediaPlayer.create(context, R.raw.myFileName)使用 raw/ 文件夹中的资源创建 mediaPlayer 的实例,然后我可以使用 .start()让该文件播放。稍后,我可以使用 .setDataSource() 的各种签名更改我要播放的文件。

我可以获取 raw/ 文件夹中给定文件的 resourceId,使用:

int resourceId = activity.getResources().getIdentifier("myFileName", "raw", activity.getPackageName());

是否可以使用此整数 resourceId 开始播放该文件而不是当前文件?或者我是否必须确定文件 res/raw/myFileName.mid 的完整路径才能更改轨道?

我希望解决方案是这样的,使用真正的方法而不是我发明的 equivalentToSetDataSourceUsingAResourceId() 方法名称。

Resources resources = activity.getResources();
String packageName = activity.getPackageName();

int white = resources.getIdentifier("white", "raw", packageName);
int black = resources.getIdentifier("black", "raw", packageName);
MediaPlayer mediaPlayer = MediaPlayer.create(activity, white);

mediaPlayer.start();
// ... and some time later...

mediaPlayer.reset();
mediaPlayer.equivalentToSetDataSourceUsingAResourceId(black);
mediaPlayer.prepare();
mediaPlayer.start();

另一种方法是销毁当前的 mediaPlayer 实例,并在每次需要更改声音文件时创建一个新实例:

if (mediaPlayer != null) {
  mediaPlayer.stop();
  mediaPlayer.release();
  mediaPlayer = null;
}

mediaPlayer = MediaPlayer.create(activity, black);
mediaPlayer.start();

这对我来说并不优雅。

最佳答案

根据 MediaPlayer documentation setDataSource API 仅允许在 MediaPlayer 的新实例(空闲状态)上使用。这意味着如果您只想一次使用一个实例,则必须从头开始release() 并重新创建 MediaPlayer。

尝试这样做。只需传递原始资源的 ID:

mMediaPlayer = MediaPlayer.create(this, R.raw.whatever);

关于android - 使用 Android mediaPlayer 播放原始文件夹中的文件,使用其 resourceId,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27298867/

相关文章:

android - 如何在android中将多个json对象的数据发送到服务器?

android - 预期类型与 Kotlin 中的 if 表达式不匹配

android - Activity 正在等待直到服务完成

android - 在Android上处理音频文件

java - AudioManager 在 setMode(MODE_IN_COMMUNICATION) 中引入延迟

android - 如何配置 Android 媒体播放器从不通过扬声器播放

java - 如何在android中设置壁纸时打开 "Set as"菜单

Android:安装一天后如何显示按钮?

android - MediaStore.Audio.Artists 中没有 "number_of_albums column"

Androids MediaPlayer 在 Activity 进入时每隔一秒播放一次视频