安卓 - 动态更改MediaPlayer中播放的文件

3

我尝试动态播放声音。

我在res文件夹下创建了一个名为“raw”的资源目录,其中包含mp3文件。

我想做的是创建一个包含所有文件名称的数组,当点击按钮时,下一个索引中的下一个mp3将被加载到媒体播放器中并可以播放。

我找到了使用媒体播放器的代码。

public class MainActivity extends ActionBarActivity {
Context context = this;
MediaPlayer mp;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_layout);
    mp = MediaPlayer.create(context, R.raw.sound);
    final Button b = (Button) findViewById(R.id.Button);
    b.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            try {
                if (mp.isPlaying()) {
                    mp.stop();
                    mp.release();
                    mp = MediaPlayer.create(context, R.raw.sound);
                } mp.start();
            } catch(Exception e) { e.printStackTrace(); }
        }
    });
}
}

但是我似乎找不到使用歌曲名称在i索引上设置通过数组切换轨道的方法。
谢谢任何帮助。
2个回答

2
我已经找到了一个解决方案。我将原始目录中所有文件的文件名设置为相同的模式,通过名称获得每个文件资源ID,并将其加载到播放器中。
Resources res = getResources(); //resource handle
    String url = "song" +index;
    InputStream is = getClass().getClassLoader().getResourceAsStream("raw/");
    Integer resIdSound = res.getIdentifier (url,  "raw", this.getPackageName());
    mp = MediaPlayer.create(this, resIdSound);
    try {
        if (mp.isPlaying()) {
            mp.stop();
            mp.release();
            mp = MediaPlayer.create(this, resIdSound);
        } mp.start();
    } catch(Exception e) { e.printStackTrace(); }
}

一个很好的实例化res文件夹并通过资源ID获取文件的方法。 但是在测试之前重新创建了mp,所以它永远不会返回isPlaying()为true。因此,每次运行该函数时,它都会在自身上播放文件。 我将mp更改为(null)类参数,并在创建之前进行了空值检测。然后在停止点击时,我再次将mp设置为null。 这起到了切换的作用。 再次强调,这个内容的第一部分非常有帮助。 - Paul V
请问为什么我们需要释放 mediaPlayer,就像 ExoPlayer 一样只需替换 URL。 - Asad Mukhtar

1

1. 基于这个来源:

动态获取所有图像资源ID的数组

你可以尝试编写以下代码:

Field[] fields= R.raw.class.getFields();
int[] resArray = new int[fields.length];
for(int i = 0; i < fields.length; i++) {
    try {
        resArray[i] = fields[i].getInt(null);
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

resArray[]将包含您在raw文件夹中拥有的所有id。

2.如果要使用文件名,可以使用Resources类中的int getIdentifier(String name, String defType, String defPackage)方法。

3.如果要使用外部存储器中的文件,可以轻松地使用文件路径创建Media Player实例(记得要授予权限)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接