【问题标题】:Use only one instance of Media Payer to play multiple audio files in android仅使用一个媒体播放器实例在 android 中播放多个音频文件
【发布时间】:2020-12-20 06:21:08
【问题描述】:

我有一个类可以播放位于某些文件夹中的音频文件...问题是我无法仅使用媒体播放器的一个实例来播放多个音频文件。每次我尝试播放不同的歌曲时,都会创建一个新的 Media Class 实例,并且新歌曲与前一首歌曲并行播放,这真的很烦人......谁能帮我只使用一个 Media Payer 实例来像在普通音频播放器中一样一首一首地播放不同的歌曲

//The files are listed as an array into a ListView, so i added a ListView.OnItemClickListener to play that location which the user has selected
ListView audiolist=(ListView)findViewById(R.id.audiolist);
 audiolist.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                if(position==id){

                    File mypath=Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
                    String mystring=(String)audiolist.getItemAtPosition(position);
                    if(mystring.contains(".mp3")) {
                        File myfile = new File(mypath.toString(), "/" + mystring);
                        Uri newuri = Uri.fromFile(myfile);
    //I think this line is the one creating the mutiple instances of the MediaPayer
                    mp=new MediaPlayer();
                             mp.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
                       mp.setAudioAttributes(
                               new AudioAttributes.Builder().setContentType(AudioAttributes.CONTENT_TYPE_MUSIC).setUsage(AudioAttributes.USAGE_MEDIA)
                                .build()
                       );
                              try {
                                    mp.setDataSource(getApplicationContext(),newuri);
                                    mp.setDisplay(holder);
                                    mp.prepare();
                                    mp.setOnBufferingUpdateListener(Audio_Player.this);
                                    mycontroller=new MediaController(Audio_Player.this);
                                    mycontroller.setMediaPlayer(Audio_Player.this);
                                    mp.start();
                                } catch (IOException e) {
                                    e.printStackTrace();
                                }
                      }//end of if
                       });//end of listview method

【问题讨论】:

    标签: java android audio


    【解决方案1】:

    根本原因

    每次用户点击ListView 中的一项时,您总是会创建一个新的MediaPlayer 实例,并且不会停止当前实例。这就解释了为什么您会看到同时播放多个音频。

    解决方案

    如果不存在,只需创建一个新的MediaPlayer 实例,否则,在播放新实例之前停止当前实例。从

    更改您的代码
    File mypath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
    String mystring = (String)audiolist.getItemAtPosition(position);
    if (mystring.contains(".mp3")) {
        File myfile = new File(mypath.toString(), "/" + mystring);
        Uri newuri = Uri.fromFile(myfile);
        // I think this line is the one creating the mutiple instances of the MediaPayer
        mp = new MediaPlayer();
        mp.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
        mp.setAudioAttributes(
               new AudioAttributes.Builder().setContentType(AudioAttributes.CONTENT_TYPE_MUSIC).setUsage(AudioAttributes.USAGE_MEDIA)
                .build()
        );
        try {
              mp.setDataSource(getApplicationContext(),newuri);
              mp.setDisplay(holder);
              mp.prepare();
              mp.setOnBufferingUpdateListener(Audio_Player.this);
              mycontroller=new MediaController(Audio_Player.this);
              mycontroller.setMediaPlayer(Audio_Player.this);
              mp.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    

    File mypath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
    String mystring = (String) audiolist.getItemAtPosition(position);
    if (mystring.contains(".mp3")) {
        File myfile = new File(mypath.toString(), "/" + mystring);
        Uri newuri = Uri.fromFile(myfile);
        // I think this line is the one creating the mutiple instances of the MediaPayer
    
        // Create a new MediaPlayer instance if there is no one existing.
        if (mp == null) {
            mp = new MediaPlayer();
            mp.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
            AudioAttributes.Builder builder = new AudioAttributes.Builder()
                    .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                    .setUsage(AudioAttributes.USAGE_MEDIA);
            mp.setAudioAttributes(builder.build());
            mp.setOnBufferingUpdateListener(Audio_Player.this);
            mycontroller = new MediaController(Audio_Player.this);
            mycontroller.setMediaPlayer(Audio_Player.this);
            mp.setDisplay(holder);
        }
    
        // If the MediaPlayer is playing, then stop it and switch to another audio,
        try {
            if (mp.isPlaying()) {
                mp.reset();
            }
            mp.setDataSource(getApplicationContext(), newuri);
            mp.prepare();
            mp.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }//end of if
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 2012-12-02
      • 1970-01-01
      • 1970-01-01
      • 2014-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多