java - 在android studio中单击原始文件夹中的ListView后,如何在第二个活动中从原始文件夹中播放多个音乐文件(.mp3)
问题描述
音乐文件在列表视图中加载,但单击其列表项应用程序崩溃时
MainActivity.Java
public class MainActivity extends AppCompatActivity {
ListView myListViewForSong;
String[] items;
TextView textView;
List<String> mysongs;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myListViewForSong = findViewById(R.id.mySongListView);
try {
display();
} catch (IllegalAccessException e)
{
e.printStackTrace();
}
}
void display() throws IllegalAccessException {
// final ArrayList<File> mysongs = findSong(Environment.clas);
final ArrayList<String> mysongs = new ArrayList<String>();
final Field[] fields = R.raw.class.getFields();
for (int i = 0; i < fields.length; i++) {
mysongs.add(fields[i].getName().toString());
// items[i] = mysongs.get(i).getName().toString().replace(".mp3", "").replace(".wav", "");
}
items = new String[mysongs.size()];
for (int i = 0; i < mysongs.size(); i++) {
items[i] = mysongs.get(i).toString();
}
ArrayAdapter<String> myAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items);
myListViewForSong.setAdapter(myAdapter);
myListViewForSong.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String songName = myListViewForSong.getItemAtPosition(position).toString();
startActivity(new Intent(getApplicationContext(),
PlayerActivity.class).putExtra("songs", mysongs).putExtra("pos", position).
putExtra("songname", songName));
}
});
}
}
单击 ListItem 后,第二个 Activity (PlayerActivity.java) 打开,如下所示。
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.graphics.PorterDuff;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.TextView;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
public class PlayerActivity extends AppCompatActivity {
Button btn_next, btn_previous, btn_pause, btn_play;
TextView songTextLabel;
SeekBar songseekBar;
static MediaPlayer mymediaPlayer;
int positn;
ArrayList<File> mysongs;
Thread updateseekbar;
String sname;
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_player);
btn_next = findViewById(R.id.next);
btn_previous = findViewById(R.id.previous);
btn_pause = findViewById(R.id.pause);
songTextLabel = findViewById(R.id.songLabel);
songseekBar = 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();
//positn = bundle.getInt("pos",0);
sname = i.getStringExtra("songName");
mysongs = (ArrayList) bundle.getParcelableArrayList("songs");
// Log.e("Data ",songs);
// sname = mysongs.get(positn).getName().toString();
String songName = i.getStringExtra("songname");
songTextLabel.setText(songName);
songTextLabel.setSelected(true);
positn = bundle.getInt("pos", 0);
Uri u = Uri.parse(mysongs.get(positn).toString());
mymediaPlayer = MediaPlayer.create(getApplicationContext(), u);
//mymediaPlayer.prepare();
mymediaPlayer.start();
}
}
到达这行代码时应用程序崩溃
Uri u = Uri.parse(mysongs.get(positn).toString());
抛出以下异常
原因:java.lang.ClassCastException:java.lang.String 无法转换为 java.io.File
完整的堆栈跟踪
1994) 在 android.os.Handler.dispatchMessage(Handler.java:108) 在 android.os.Looper.loop(Looper.java:166) 在 android.app.ActivityThread.main(ActivityThread.java:7529) 在 java。 lang.reflect.Method.invoke(Native Method) 在 com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921 ) I/Process:发送信号。PID:4216 SIG:9 进程 4216 终止。android.internal.os.ZygoteInit.main(ZygoteInit.java:921) I/Process:发送信号。PID:4216 SIG:9 进程 4216 终止。android.internal.os.ZygoteInit.main(ZygoteInit.java:921) I/Process:发送信号。PID:4216 SIG:9 进程 4216 终止。
解决方案
推荐阅读
- javascript - 如何在 nuxt.config.js 中扩展 webpack > config > externals?
- python - 如何在python中一次将许多图像转换为灰度
- python - 为什么这一行:man_1.print(emps) 在 python 3.8 中没有任何输出
- javascript - 如何在数据表中的按钮名称上添加选择过滤器
- android - 我们可以用我们的应用程序关闭/终止另一个应用程序吗?
- linux - 在 dockerfile 中运行的 dotnet watch 不起作用
- html - 用文本悬停时展开侧边栏
- node.js - 检索数组中子文档的 ._id
- python - 如何在 python 中获得高于和低于平均值的值?
- swift - 如何在 SwiftUI/Combine 中将订阅者附加到状态或绑定?