gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 19:50:35 25 4
gpt4 key购买 nike

我正在开发一个锻炼应用程序,在锻炼时带有一点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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com