如何在Android Studio中单击“来自原始文件夹的ListView之后在第二个活动中从原始文件夹播放多个音乐文件(.mp3)

问题描述 投票:0回答:1

音乐文件已加载到列表视图中,但是单击其列表项应用崩溃时

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

完整堆栈跟踪

E / AndroidRuntime:致命异常:主要流程:com.example.babies摇篮曲,PID:4216java.lang.RuntimeException:无法启动活动ComponentInfo {com.example.babieslullabies / com.example.babieslullabies.PlayerActivity}:java.lang.ClassCastException:无法将java.lang.String强制转换为java.io.File在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3303)在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3411)在android.app.ActivityThread.-wrap12(未知来源:0)在android.app.ActivityThread $ H.handleMessage(ActivityThread.java: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(本机方法)在com.android.internal.os.Zygote $ MethodAndArgsCaller.run(Zygote.java:245)在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)原因:java.lang.ClassCastException:无法将java.lang.String强制转换为java.io.File在com.example.babieslullabies.PlayerActivity.onCreate(PlayerActivity.java:113)在android.app.Activity.performCreate(Activity.java:7383)在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1218)在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3256)在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3411)在android.app.ActivityThread.-wrap12(未知来源:0)在android.app.ActivityThread $ H.handleMessage(ActivityThread.java: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(本机方法)在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已终止。

java android android-studio android-mediaplayer android-music-player
1个回答
0
投票

尝试在一段代码上运行该代码:

AsyncTask.execute(new Runnable(){
    @Override
       public void run(){
          //HERE
       }
});
© www.soinside.com 2019 - 2024. All rights reserved.