首页 > 解决方案 > 在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 终止。

标签: javaandroidandroid-studioandroid-mediaplayerandroid-music-player

解决方案


推荐阅读