【问题标题】:android - changing the file played in mediaplayer dynamicallyandroid - 动态更改媒体播放器中播放的文件
【发布时间】:2017-02-16 04:23:45
【问题描述】:

我正在尝试动态播放声音。 我在 res 文件夹下创建了一个名为“raw”的资源目录。这个目录包含 mp3 文件。 我想要做的是制作一个包含所有文件名的数组,当点击一个按钮时,下一个 mp3 int 下一个索引将被加载到媒体播放器并且可以播放。

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

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 索引上的歌曲名称通过数组设置曲目切换的方法。

感谢您的帮助

【问题讨论】:

    标签: java android android-mediaplayer


    【解决方案1】:

    我找到了解决办法。 我已将原始目录中的所有文件名设置为相同的名称模式, 通过名称获取每个文件资源 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 更改为(空)类参数,并在创建它之前进行空测试。然后在停止点击时,我再次将 mp 设置为空。这作为一个切换。同样,本文的第一部分非常有帮助。
    • 请问为什么我们需要发布 mediaPlayer,就像 ExoPlayer 一样只需替换 URL。
    【解决方案2】:

    1.基于此来源:

    dynamically getting all image resource id in an array

    你可以尝试写这样的代码:

    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 实例(记住权限)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-21
      • 1970-01-01
      • 1970-01-01
      • 2012-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多