AssetFileDescriptor和媒体播放器#ISUESS

时间:2016-09-08 12:00:50

标签: java android

我试图通过点击我的应用程序中的按钮来播放歌曲。应用程序中有两个按钮。每个按钮可以播放不同的歌曲。我在Assets文件夹中分配了所有这些歌曲。现在,Assets文件夹中总共有两首歌曲。

public class AudioCollective implements MediaPlayer.OnPreparedListener, OnCompletionListener{
    static String TAG = "AudioCollective====>";
    Context mContext;
    MediaPlayer mPlayer;
    ArrayList<AssetFileDescriptor> array;

    public AudioCollective(Context theContext){
        mContext = theContext;

    }

    public void addSound(int SoundID){
        array = new ArrayList<AssetFileDescriptor>();
        AssetFileDescriptor afd = mContext.getResources().openRawResourceFd(SoundID);
        array.add(afd);
    }


    public void playSound() {

       for (int i =0; i<array.size();i++) {
           Log.i(TAG,"preparing audio " + array.get(i) );
            mPlayer = new MediaPlayer();
           try {
               mPlayer.setDataSource(array.get(i).getFileDescriptor());
           } catch (IOException e) {
               e.printStackTrace();
           }
           try {
               mPlayer.prepare();
           } catch (IOException e) {
               e.printStackTrace();
           }
           mPlayer.setOnPreparedListener(this);
           mPlayer.setOnCompletionListener(this);
       }


    }

    @Override
    public void onCompletion(MediaPlayer mediaPlayer) {
        if (mPlayer != null) {
            Log.d(TAG, "releasing audio  now");
            mPlayer.release();
            mPlayer = null;
            mediaPlayer.release();
            //mediaPlayer = null;
        }
    }

    @Override
    public void onPrepared(MediaPlayer mediaPlayer) {
        Log.i(TAG, "playing audio  now");
        mediaPlayer.start();
    }
}

同时在我的MainActivity中:

AudioCollective ac = new AudioCollective();
ac.addSounds(R.raw.na);
playButton.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view){
               ac.playSound();
            }
        });

所以,问题是每次我点击按钮,应用程序一起播放两首歌曲而不是播放所需的歌曲。谁能告诉我为什么会这样呢?

1 个答案:

答案 0 :(得分:0)

  

是的,因为你在for循环中同时播放它们。

playSound()方法传递值更新为参数。

播放第一首歌曲0,播放第二首歌曲1。

playSound(0) playSound(1)

     public void playSound(int pos) {

           Log.i(TAG,"preparing audio " + array.get(pos) );
            mPlayer = new MediaPlayer();
           try {
               mPlayer.setDataSource(array.get(pos).getFileDescriptor());
           } catch (IOException e) {
               e.printStackTrace();
           }
           try {
               mPlayer.prepare();
           } catch (IOException e) {
               e.printStackTrace();
           }
           mPlayer.setOnPreparedListener(this);
           mPlayer.setOnCompletionListener(this);
       }
    }