android - Android:选择列表视图项目时如何播放歌曲
问题描述
我创建了一个列表视图来播放媒体文件 mp3 歌曲。如果我选择要播放的第一首歌曲,它正在播放,但如果我在列表视图中选择第二首或另一首歌曲,那么它会再次播放第一首歌曲。我希望如果我选择第二首或任何其他列表视图歌曲,他们将被选择播放。请帮助我解决此类问题...提前谢谢您。下面是我的代码。主要活动
public class MainActivity extends AppCompatActivity {
ListView mysonglistview;
String[] items;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mysonglistview = (ListView) findViewById(R.id.songlistview);
runtimepermission();
}
public void runtimepermission(){
Dexter.withActivity(this)
.withPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
.withListener(new PermissionListener() {
@Override
public void onPermissionGranted(PermissionGrantedResponse response) {
display();
}
@Override
public void onPermissionDenied(PermissionDeniedResponse response) {
}
@Override
public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) {
token.continuePermissionRequest();
}
}).check();
}
public ArrayList<File> findSong(File file){
ArrayList<File> arrayList = new ArrayList<>();
File[] files = file.listFiles();
for (File singleFile: files){
if (singleFile.isDirectory() && !singleFile.isHidden()){
arrayList.addAll(findSong(singleFile));
}
else {
if (singleFile.getName().endsWith(".mp3") ||
singleFile.getName().endsWith(".wav")){
arrayList.add(singleFile);
}
}
}
return arrayList;
}
void display(){
final ArrayList<File> mySongs = findSong(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(".wav","");
}
ArrayAdapter<String> myadapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,items);
mysonglistview.setAdapter(myadapter);
mysonglistview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int i, long l) {
String SongName = mysonglistview.getItemAtPosition(i).toString();
startActivity(new Intent(getApplicationContext(), PlayerActivity.class)
.putExtra("songs", mySongs).putExtra("songname", SongName)
.putExtra("pos", 1));
}
});
}
}
这是 PlayerActivity.Java 代码
public class PlayerActivity extends AppCompatActivity {
Button btn_next, previous, pause;
TextView songTextlabel;
SeekBar songseekbar;
static MediaPlayer mymediaplayer;
int position;
String sname;
ArrayList<File> mySongs;
Thread updateseekbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_player);
btn_next = (Button) findViewById(R.id.next);
previous = (Button) findViewById(R.id.previous);
pause = (Button) findViewById(R.id.pause);
songTextlabel = (TextView) findViewById(R.id.songlabel);
songseekbar = (SeekBar) findViewById(R.id.seekbar);
getSupportActionBar().setTitle("Now Playing");
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
updateseekbar = new Thread() {
@Override
public void run() {
int totalDuration = mymediaplayer.getDuration();
int currentposition = 0;
while (currentposition < totalDuration) {
try {
sleep(500);
currentposition = mymediaplayer.getCurrentPosition();
songseekbar.setProgress(currentposition);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
if (mymediaplayer != null) {
mymediaplayer.stop();
mymediaplayer.release();
}
Intent i = getIntent();
Bundle bundle = i.getExtras();
mySongs = (ArrayList) bundle.getParcelableArrayList("songs");
sname = mySongs.get(position).getName().toString();
String songName = i.getStringExtra("songname");
songTextlabel.setText(songName);
songTextlabel.setSelected(true);
position = bundle.getInt("pos", 0);
Uri u = Uri.parse(mySongs.get(position).toString());
mymediaplayer = MediaPlayer.create(getApplicationContext(), u);
mymediaplayer.start();
songseekbar.setMax(mymediaplayer.getDuration());
//seekbar color
updateseekbar.start();
songseekbar.getProgressDrawable().setColorFilter(getResources().getColor(R.color.colorPrimary), PorterDuff.Mode.MULTIPLY);
songseekbar.getThumb().setColorFilter(getResources().getColor(R.color.colorPrimary), PorterDuff.Mode.SRC_IN);
songseekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
mymediaplayer.seekTo(seekBar.getProgress());
}
});
pause.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
songseekbar.setMax(mymediaplayer.getDuration());
if (mymediaplayer.isPlaying()) {
pause.setBackgroundResource(R.drawable.icon_play);
mymediaplayer.pause();
} else {
pause.setBackgroundResource(R.drawable.icon_pause);
mymediaplayer.start();
}
}
});
btn_next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mymediaplayer.stop();
mymediaplayer.release();
position = ((position + 1) % mySongs.size());
Uri u = Uri.parse(mySongs.get(position).toString());
mymediaplayer = MediaPlayer.create(getApplicationContext(), u);
sname = mySongs.get(position).getName().toString();
songTextlabel.setText(sname);
mymediaplayer.start();
}
});
previous.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mymediaplayer.stop();
mymediaplayer.release();
position = ((position - 1) < 0) ? (mySongs.size() - 1) : (position - 1);
Uri u = Uri.parse(mySongs.get(position).toString());
mymediaplayer = MediaPlayer.create(getApplicationContext(), u);
sname = mySongs.get(position).getName().toString();
songTextlabel.setText(sname);
mymediaplayer.start();
}
});
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId()== android.R.id.home){
onBackPressed();
}
return super.onOptionsItemSelected(item);
}
}
解决方案
你在这里传递硬编码的参数
startActivity(new Intent(getApplicationContext(), PlayerActivity.class) .putExtra("songs", mySongs).putExtra("songname", SongName) .putExtra("pos", 1)); // change 1 to i
在 PlayerActivity 中:
在类的顶部,您声明变量位置
整数位置;
此时,您只声明了 int位置(声明的 int 的默认值为 0 )
稍后在代码中执行以下操作:
sname = mySongs.get(position).getName().toString();
此时位置仍为0,因为它只是被声明(你总是得到第一首歌的原因)。
之后,您将位置的值更改为通过意图传递的任何值
位置 = bundle.getInt("pos", 0);
为了得到你想要的,你必须做
位置 = bundle.getInt("pos", 0)
sname = mySongs.get(position).getName().toString();
就是这样!
默认值参考: https ://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
在旁注中,不要通过意图传递大物体。您应该使用意图仅传递 ID 之类的内容,然后在接收活动时使用该 ID 来获取您需要的任何内容。
编辑:尝试很好地格式化您的代码,它应该会在未来为您带来更多响应。
推荐阅读
- javascript - 承诺后的 DispatchEvent (.then)
- ios - 发布方法 HTTPHeader 中的 Alamofire 5.1 更新问题,使用 alamofire 的网络调用
- html - 我找不到使用 jQuery 的特定元素
- java - 使用素数java打印算术级数
- redis - 我可以这样使用nestjs缓存服务吗?
- kotlin - 避免使用多态性(或设计模式)进行强制转换
- apache-superset - 如何连接 Apache Druid 和 Apache Superset
- reactjs - Semantic UI Dropdown ,尝试将状态从子级设置为父级
- javascript - 在 react-select 中的选项末尾附加一个按钮
- java - SonarQube 安全热点,使用正则表达式