Android Media Player一起播放多首歌曲

时间:2014-05-20 06:29:23

标签: java android audio

我正在写一个Church Application,其中我提供Music Player功能,几乎完成了我的要求,但面临小问题。

我如何实现我的音乐播放器:

  1. 列出SD卡中可用的音频歌曲(路径如:Environment.getExternalStorageDirectory() + "/Church Application/Prayers"
  2. 用户点击任何音频然后启动媒体播放器
  3. 在Media Player屏幕中,我向用户提供导航以返回音频列表
  4. 用户回来后现在选择了另外一首歌来听(这里我遇到问题,用户可以播放新选择的歌曲,但是老歌也在播放,而只有最后选择的歌曲会一次播放,但是在我的情况下,两首歌都在播放)
  5. PlayListActivity.java: -

        // selecting single ListView item
        ListView lv = getListView();
        // listening to single listitem click
        lv.setOnItemClickListener(new OnItemClickListener() {
    
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                // getting listitem index
                int songIndex = position;
    
                // Starting new intent
                Intent in = new Intent(getApplicationContext(),
                        MediaPlayerActivity.class);
                // Sending songIndex to PlayerActivity
                in.putExtra("songIndex", songIndex);
                setResult(100, in);
                startActivity(in);
                // Closing PlayListView
                finish();
            }
        });
    

    MediaPlayerActivity.java: -

        int value ;
    
        @Override
            public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.player);
    
    
                    mp = new MediaPlayer();
                songManager = new SongsManager();
                utils = new Utilities();
    
                songProgressBar.setOnSeekBarChangeListener(this); // Important
                mp.setOnCompletionListener(this); // Important
    
                songsList = songManager.getPlayList();
    
                Bundle extras = getIntent().getExtras();
                if (extras != null) {
                    value = extras.getInt("songIndex");
                }
    
                playSong(value);
    
    
                btnPlay.setOnClickListener(new View.OnClickListener() {
    
                    @Override
                    public void onClick(View arg0) {
                        // check for already playing
                        if (mp.isPlaying()) {
                            if (mp != null) {
                                mp.pause();
                                // Changing button image to play button
                                btnPlay.setImageResource(R.drawable.btn_play);
                            }
                        } else {
                            // Resume song
                            if (mp != null) {
                                mp.start();
                                // Changing button image to pause button
                                btnPlay.setImageResource(R.drawable.btn_pause);
                            }
                        }
    
                    }
                });
    
    @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (resultCode == 100) {
                currentSongIndex = data.getExtras().getInt("songIndex");
                // play selected song
                playSong(currentSongIndex);
            }
    
        }
    
        public void playSong(int songIndex) {
            // Play song
            try {
    
                mp.reset();
                mp.setDataSource(songsList.get(songIndex).get("songPath"));
                mp.prepare();
                mp.start();
                // Displaying Song title
                String songTitle = songsList.get(songIndex).get("songTitle");
                songTitleLabel.setText(songTitle);
    
                // Changing Button Image to pause image
                btnPlay.setImageResource(R.drawable.btn_pause);
    
                // set Progress bar values
                songProgressBar.setProgress(0);
                songProgressBar.setMax(100);
    
                // Updating progress bar
                updateProgressBar();
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalStateException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        public void updateProgressBar() {
            mHandler.postDelayed(mUpdateTimeTask, 100);
        }
    
        private Runnable mUpdateTimeTask = new Runnable() {
            public void run() {
                long totalDuration = mp.getDuration();
                long currentDuration = mp.getCurrentPosition();
    
                // Displaying time completed playing
                songCurrentDurationLabel.setText(""
                        + utils.milliSecondsToTimer(currentDuration));
    
                // Updating progress bar
                int progress = (int) (utils.getProgressPercentage(currentDuration,
                        totalDuration));
                // Log.d("Progress", ""+progress);
                songProgressBar.setProgress(progress);
    
                // Running this thread after 100 milliseconds
                mHandler.postDelayed(this, 100);
            }
        };
    
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress,
                boolean fromTouch) {
    
        }
    
        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
            // remove message Handler from updating progress bar
            mHandler.removeCallbacks(mUpdateTimeTask);
        }
    
        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            mHandler.removeCallbacks(mUpdateTimeTask);
            int totalDuration = mp.getDuration();
            int currentPosition = utils.progressToTimer(seekBar.getProgress(),
                    totalDuration);
    
            // forward or backward to certain seconds
            mp.seekTo(currentPosition);
    
            // update timer progress again
            updateProgressBar();
        }
    
        @Override
        public void onCompletion(MediaPlayer arg0) {
    
            // check for repeat is ON or OFF
            if (isRepeat) {
                // repeat is on play same song again
                playSong(currentSongIndex);
            } else if (isShuffle) {
                // shuffle is on - play a random song
                Random rand = new Random();
                currentSongIndex = rand.nextInt((songsList.size() - 1) - 0 + 1) + 0;
                playSong(currentSongIndex);
            } else {
                // no repeat or shuffle ON - play next song
                if (currentSongIndex < (songsList.size() - 1)) {
                    playSong(currentSongIndex + 1);
                    currentSongIndex = currentSongIndex + 1;
                } else {
                    // play first song
                    playSong(0);
                    currentSongIndex = 0;
                }
            }
        }
    
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
            // if one of the volume keys were pressed
            if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN
                    || keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
            }
            // propagate the key event
            return super.onKeyDown(keyCode, event);
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            mp.release();
        }
    
    }
    

2 个答案:

答案 0 :(得分:1)

        songManager = new SongsManager();
        utils = new Utilities();

        songProgressBar.setOnSeekBarChangeListener(this); 


        songsList = songManager.getPlayList();

        Bundle extras = getIntent().getExtras();
        if (extras != null) {
            value = extras.getInt("songIndex");
        }

        //playSong(value); 

        if (mp != null){ 
          try { 
             mp.relase(); 
             mp = null; 
          } catch (Exception e) { 

          } 

        mp = new MediaPlayer(); 
        playSong(value); 
      }else{ 
        mp = new MediaPlayer(); 
        playSong(value); 
      }

        mp.setOnCompletionListener(this); // Important

答案 1 :(得分:0)

在您新媒体播放器再次检查媒体播放器是否正在播放之前,请停止并播放新歌

if(mediaplayer!=null){
if(mediaplayer.isPlaying(){
mediaplayer.stop();
}
}