当前位置: 首页 > 知识库问答 >
问题:

一起播放多首歌曲的Android媒体播放器

索嘉胜
2023-03-14

我正在编写一个教会应用程序,其中我提供了音乐播放器功能,几乎满足了我的需求,但面临一些小问题。

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

  1. 正在列出SD卡中可用的音频歌曲(路径类似:Environment.GetExternalStorageDirectory()+“/church application/prayers”)
  2. 一旦用户点击任何音频,然后启动媒体播放器
  3. 在媒体播放器屏幕中,我为用户提供了返回音频列表的导航
  4. 用户返回,现在选择了一些其他歌曲来听(这里我面临的问题是,用户将可以播放新选择的歌曲,但也会播放旧歌曲,而一次只能播放上一次选择的歌曲,但在我的情况下,这两首歌曲都在播放)

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();
    }

}

共有1个答案

乜思淼
2023-03-14
        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
 类似资料:
  • 我正在制作音频播放器(android)。问题是我什么时候启动我的应用程序

  • 1.1.1. 多媒体播放 1.1.1. 多媒体播放 我们事实上对上游芯片厂商自带的播放器方式做了调整。 Amlogic 芯片 BaseCode 我们禁用了芯片厂商的原生代码的 libplayer 包,原因是芯片厂商的播放器是直接使用 ALSA 框架来调用音频播放功能的。 这对我们 RokidOS 平台让多个进程使用音频设备造成阻碍。基于这个因素,我们使用了 RokidOS 开发的媒体播放库 lib

  • 我无法使用exoplayer2.2离线播放歌曲。 这是我的密码。 我得到以下错误。 谁能帮忙吗。

  • 我正在开发一个包含一些音频播放器的RecyclerView的应用程序。应用程序将下载。3gp文件(如果尚未下载)。 当我单击playAudio按钮时,音频未被播放。 这是我的适配器代码: 我怎样才能解决这个问题?

  • 我正在开发一个包含两个活动的应用程序,一个是媒体播放器,另一个是要播放的歌曲列表,mp3播放器工作正常,从活动列表中我传递歌曲的名称和播放器工作正常。我有两个问题,如果用户播放一首歌并离开应用程序(这首歌一直在后台播放,这就是假设的工作方式),然后用户返回应用程序,搜索栏设置为0,计时器设置为0,有没有办法“保存”活动......也是如果一首歌正在播放,用户试图播放另一首歌,这首歌在前一首歌的顶部

  • 我有一个创建和播放我播放列表的文字JS对象。在HTML页面中,我有一个包含我所有曲目的列表。当我点击某些曲目时,一切正常,但当我点击一个曲目,等待曲目结束时,下一个曲目就不播放了。这是我的代码的部分: 还有一件事,当第一首歌曲结束并调用下一首歌曲的播放时,曲目没有加载(onload事件没有消息返回)。谢谢,对不起我的英语不好。A. 好的,我试着在设置上添加“FlashVersion:9”,这就解决