Java Android MediaPlayer仅播放前2个文件

Java Android MediaPlayer仅播放前2个文件,java,android,Java,Android,我正在开发一个锻炼应用程序,在锻炼时使用一点MediaPlayer,在此之前,用户可以在锻炼时选择他想要听的歌曲,即使我再选择3首,MediaPlayer只播放前2首,希望你能帮我 播放列表\u Picker.java 在这里,用户选择他想要听的歌曲 public class Playlist_Picker extends AppCompatActivity { ListView lv; String[] items; Button clean,done;

我正在开发一个锻炼应用程序,在锻炼时使用一点MediaPlayer,在此之前,用户可以在锻炼时选择他想要听的歌曲,即使我再选择3首,MediaPlayer只播放前2首,希望你能帮我

播放列表\u Picker.java

在这里,用户选择他想要听的歌曲

    public class Playlist_Picker extends AppCompatActivity {
    ListView lv;
    String[] items;
    Button clean,done;
    long[] selected;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_playlist__picker);
        lv = (ListView)findViewById(R.id.lvPlaylist);
        clean = (Button)findViewById(R.id.clean);
        clean.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

            }
        });
        done = (Button)findViewById(R.id.done);


        final ArrayList<File> mySongs = findSongs(Environment.getExternalStorageDirectory());
        items = new String[mySongs.size()];
        for (int i = 0; i<mySongs.size(); i++){
            items[i]= mySongs.get(i).getName().toString().replace(".mp3","").replace(".mp3","");

        }

        ArrayAdapter<String> adp = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_multiple_choice,android.R.id.text1,items);
        lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        lv.setAdapter(adp);
        done.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int choice = lv.getCount();
                selected = new long[choice];
                for (int i = 0; i<choice ; i++){
                    selected[i]=-1;
                }
                SparseBooleanArray spa = lv.getCheckedItemPositions();
                for (int i = 0; i < choice; i++){
                    if (spa.get(i)){
                        selected[i] = lv.getItemIdAtPosition(i);
                    }
                }

                startActivity(new Intent(getApplicationContext(),Workout.class).putExtra("pos",selected).putExtra("songlist",mySongs) );
                finish();
            }
        });
    }

    public void toast(String text){
        Toast.makeText(getApplicationContext(),text,Toast.LENGTH_SHORT).show();
    }

    public ArrayList<File> findSongs(File root){
        ArrayList<File> al = new ArrayList<File>();
        File[] files = root.listFiles();
        for(File singleFile : files){
            if (singleFile.isDirectory() && !singleFile.isHidden()){
                al.addAll(findSongs(singleFile));
            }
            else{
                if (singleFile.getName().endsWith(".mp3") || singleFile.getName().endsWith(".wav")){
                    al.add(singleFile);
                }
            }
        }

        return al;
    }
}
public class Playlist\u选择器扩展appcompative活动{
ListView lv;
字符串[]项;
按钮清洁,完成;
长[]选择;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u playlist\u picker);
lv=(ListView)findViewById(R.id.lvPlaylist);
clean=(按钮)findviewbyd(R.id.clean);
clean.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
}
});
完成=(按钮)findViewById(R.id.done);
final ArrayList mySongs=findSongs(Environment.getExternalStorageDirectory());
items=新字符串[mySongs.size()];

对于(int i=0;i您只是将完成侦听器添加到随后销毁的第一个MediaPlayer。因此,您没有将另一个添加到当前的MediaPlayer。这都很愚蠢,因为您为什么要发布它,您仍然需要一个。解决方案可能是在该循环中调用mp.setOnCompleteInListner(this)

正确地说,您应该只添加一次completionListener。您应该保留MediaPlayer实例,而不是一直保留它。release()如果您想使用它播放其他歌曲,请保留现有的一首

我建议你研究一下状态图

你实际上需要做的是添加适当的钩子,让它在加载下一首歌曲并在当前侦听器中播放,直到队列结束,然后继续播放并消失,或者重播,或者做任何你想做的事情。核心问题是你一次添加mediaplayer完成侦听器,这将设置下一首歌曲在当前歌曲完成后,通过销毁您拥有的媒体播放器并制作一个新的媒体播放器(该媒体播放器上没有完成侦听器)播放歌曲。这会导致它完成第一首歌曲,触发侦听器,启动第二首歌曲,然后退出,因为第二首歌曲上没有完成侦听器

if (mp!=null){
            mp.stop();
            mp.release();
        }

        Intent i = getIntent();
        Bundle b = i.getExtras();
        mySongs = (ArrayList) b.getParcelableArrayList("songlist");
        position = b.getLongArray("pos");
        playlist = new ArrayList<>();

        for(int j = 0; j < mySongs.size(); j++){
            if (j == position[j]){
                playlist.add(mySongs.get(j));
//                x++;
            }
        }

        u = Uri.parse(playlist.get(x).toString());
        mp = MediaPlayer.create(getApplicationContext(),u);

//        sb.setMax(mp.getDuration());
        String Songname = playlist.get(x).getName().toString().replace(".mp3","");
        song_name.setText(Songname);
        btPlay.setVisibility(View.GONE);
        btPause.setVisibility(View.VISIBLE);
//        updateSeekBar.start();
        int playlist_size = playlist.size();
        if (playlist_size>1){
//            Toast.makeText(getApplicationContext(),
//
//                    "mas de 1 cancion",
//
//                    Toast.LENGTH_LONG).show();
            mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mediaPlayer) {
                    mp.stop();
                    mp.release();
                    x = (x+1)%playlist.size();
//                    Toast.makeText(getApplicationContext(), getString(x),Toast.LENGTH_LONG).show();
                    u = Uri.parse(playlist.get(x).toString());
                    String Songname = playlist.get(x).getName().toString().replace(".mp3","");
                    song_name.setText(Songname);
                    mp = MediaPlayer.create(getApplicationContext(),u);
//                    updateSeekBar.start();
                    mp.start();
//                    sb.setMax(mp.getDuration());

                }
            });
        }else{
            mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mediaPlayer) {
                    mp.stop();
                    mp.release();
//                    x = 0;
                    u = Uri.parse(playlist.get(x).toString());
                    mp = MediaPlayer.create(getApplicationContext(),u);
                    mp.start();
//                    sb.setMax(mp.getDuration());
                }
            });
        }