java - Android MediaPlayer 只播放前 2 个文件

标签 java android

我正在开发一个锻炼应用程序,在锻炼时带有一点MediaPlayer,在此之前,用户可以在锻炼时选择他想听的歌曲,即使我选择了 3 o 多,< strong>MediaPlayer 只播放前2个,希望你能帮助我

Playlist_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;
    }
}

WorkingOut.java

这里我得到数组并播放文件,但 OnCompletitionListener 只工作 1 次,即使有超过 2 个文件

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

最佳答案

您只是将完成监听器添加到您随后销毁的第一个 MediaPlayer。所以你没有在当前的上添加另一个。这都很愚蠢,因为你为什么要发布它,你仍然需要一个。解决方案可能是在该循环内调用 mp.setOnCompleteionListner(this)。

正确地,您应该只添加一次 completionListener。而且你应该一直保留 MediaPlayer 的实例而不是 .release() 。您想用它来播放其他歌曲,所以请保留您拥有的那首。

我建议你研究一下状态图。 mediaplayer state diagram

您实际需要做的是添加适当的 Hook ,让它在完成加载下一首歌曲后返回并在当前听众中播放直到队列完成,然后继续并消失,或重播或任何你想要的。核心问题是你添加了一次媒体播放器完成监听器,它通过销毁你拥有的媒体播放器并制作一个新的(没有那个完成监听器)在当前歌曲完成后设置下一首歌曲。这会导致它完成第一首歌曲,触发监听器,开始播放第二首歌曲然后退出,因为第二首没有完成监听器。

关于java - Android MediaPlayer 只播放前 2 个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37176583/

相关文章:

java - libGDX - 如果我播放声音,我的 Android 手机会口吃/有微延迟

java - 如何重命名 JList 中的 Object[] 列表

android - 对文件 : Translation has been interrupted 进行索引时出现异常

android - android中的旋转和缩放imageview

Android:ItemizedOverlay onTouchEvent 和 onTap 重叠

java - 同时添加到 ArrayList 的并发线程 - 会发生什么?

Java 在增加与添加一时未返回正确的树搜索结果

java - 如何使用 SQLite 中的子列表填充复杂列表?

android - 无法为 fragment 设置菜单

java - a4j :ajax listener exception MethodNotFoundException