Java Android MediaPlayer仅播放前2个文件
我正在开发一个锻炼应用程序,在锻炼时使用一点MediaPlayer,在此之前,用户可以在锻炼时选择他想要听的歌曲,即使我再选择3首,MediaPlayer只播放前2首,希望你能帮我 播放列表\u Picker.java 在这里,用户选择他想要听的歌曲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;
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());
}
});
}