0

Help me I am stuck on this, mediaPlayer.setDataSource() is giving error when clicking on any song list in recycler view. I am new to Android Studio as I have started it past year. Here is the video of what is happening in my app

java.lang.IllegalStateException
    at android.media.MediaPlayer._setDataSource(Native Method)
    at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1296)
    at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1279)
    at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1261)
    at android.media.MediaPlayer.attemptDataSource(MediaPlayer.java:1155)
    at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1112)
    at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1019)
    at com.example.musify.MainActivity$10.run(MainActivity.java:454)
    at java.lang.Thread.run(Thread.java:919)**

Always getting error in onchanged method setDataSource:

@Override
public void onChanged(int position) {
    currentSongNumber = position;
    CreateNotification.createNotification(MainActivity.this,musicLists.get(currentSongNumber),R.drawable.ic_baseline_pause_24,currentSongNumber,musicLists.size()-1);
        
    if(mediaPlayer.isPlaying())
    {
        mediaPlayer.pause();
        mediaPlayer.stop();
    }


    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                mediaPlayer.reset();
                mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                //this is the place where i am getting error although i have reset on instance of mediaplayer
                mediaPlayer.setDataSource(MainActivity.this, musicLists.get(currentSongNumber).getMusicFile());
                
                MainActivity.this.runOnUiThread(() -> {
//                    musicbar_artist.setText(musicLists.get(currentSongNumber).getArtist());
                    musicbar_name.setText(musicLists.get(currentSongNumber).getTitle());
                });


            } catch (IOException e) {
                new Handler(Looper.getMainLooper()).post(() -> Toast.makeText(MainActivity.this, "Unable to Play Track!", Toast.LENGTH_SHORT).show());
                e.printStackTrace();
            }
            try {
                mediaPlayer.prepare();
                mediaPlayer.start();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }).start();

    mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            final int getTotalDuration = mp.getDuration();


            String generateDuration = String.format(Locale.getDefault(),"%02d:%02d",
                    TimeUnit.MILLISECONDS.toMinutes(getTotalDuration),
                    TimeUnit.MILLISECONDS.toSeconds(getTotalDuration)-
                            TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(getTotalDuration)));
            endTime.setText(generateDuration);
            isPlaying = true;
            mp.start();

            playSeekbar.setMax(getTotalDuration);
            playpauseImage.setImageResource(R.drawable.pause_svg);
        }
    });

    timer = new Timer();
    timer.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    final int getCurrentDuration = mediaPlayer.getCurrentPosition();
                    String generateDuration = String.format(Locale.getDefault(),"%02d:%02d",
                            TimeUnit.MILLISECONDS.toMinutes(getCurrentDuration),
                            TimeUnit.MILLISECONDS.toSeconds(getCurrentDuration)-
                                    TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(getCurrentDuration)));

                    playSeekbar.setProgress(getCurrentDuration);
                    startTime.setText(generateDuration);

                }
            });

            mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {
                    mediaPlayer.reset();
                    String tm = "00:00";
                    startTime.setText(tm);
                    timer.purge();
                    timer.cancel();

                    isPlaying = false;
                    playpauseImage.setImageResource(R.drawable.ic_baseline_play_arrow_24);
                    playSeekbar.setProgress(0);

                    musicAdapater.update(musicLists);
                    musicRecyclerV.scrollToPosition(0);

                    // starts next music
                    onNext();

                }
            });
        }
    },1000,1000);
}

@Override
public void onPlay() {

    CreateNotification.createNotification(MainActivity.this,musicLists.get(currentSongNumber),R.drawable.ic_baseline_pause_24,currentSongNumber,musicLists.size()-1);

    isPlaying = true;
    playpauseImage.setImageResource(R.drawable.pause_svg);
    mediaPlayer.start();
    musicLists.get(currentSongNumber).setPlaying(true);
    musicbar_name.setText(musicLists.get(currentSongNumber).getTitle());
//        musicbar_artist.setText(musicLists.get(currentSongNumber).getArtist());

    musicAdapater.update(musicLists);
    musicRecyclerV.scrollToPosition(currentSongNumber);
    onChanged(currentSongNumber);
}

@Override
public void onPrev() {

    int prevsongnumber = currentSongNumber-1;

    if(prevsongnumber<0)
    {
        prevsongnumber = musicLists.size()-1;
    }

    CreateNotification.createNotification(MainActivity.this,musicLists.get(prevsongnumber),R.drawable.ic_baseline_pause_24,prevsongnumber,musicLists.size()-1);

    musicLists.get(currentSongNumber).setPlaying(false);

    musicLists.get(prevsongnumber).setPlaying(true);

    musicbar_name.setText(musicLists.get(prevsongnumber).getTitle());
//        musicbar_artist.setText(musicLists.get(prevsongnumber).getArtist());

    musicAdapater.update(musicLists);
    musicRecyclerV.scrollToPosition(prevsongnumber);
    onChanged(prevsongnumber);
}

@Override
public void onPaused() {

    CreateNotification.createNotification(MainActivity.this,musicLists.get(currentSongNumber),R.drawable.ic_baseline_play_arrow_24,currentSongNumber,musicLists.size()-1);

    isPlaying = false;
    mediaPlayer.pause();
    playpauseImage.setImageResource(R.drawable.ic_baseline_play_arrow_24);
}

@Override
public void onNext() {

    int nextsongnumber = currentSongNumber+1;
    if(nextsongnumber>=musicLists.size())
    {
        nextsongnumber = 0;
    }


    CreateNotification.createNotification(MainActivity.this,musicLists.get(nextsongnumber),R.drawable.ic_baseline_pause_24,nextsongnumber,musicLists.size()-1);


    musicLists.get(currentSongNumber).setPlaying(false);

    musicLists.get(nextsongnumber).setPlaying(true);

    musicbar_name.setText(musicLists.get(nextsongnumber).getTitle());
//        musicbar_artist.setText(musicLists.get(nextsongnumber).getArtist());

    musicAdapater.update(musicLists);
    musicRecyclerV.scrollToPosition(nextsongnumber);
    onChanged(nextsongnumber);
}
Ryan M
  • 18,333
  • 31
  • 67
  • 74

1 Answers1

0

MediaPlayer.create() is better than setDatasource
got this from a YouTube comment!!

    if(mediaPlayer.isPlaying())
        {
            mediaPlayer.pause();
        }
        mediaPlayer.stop();
        mediaPlayer.release();
        // passing applicationContext() and uri file of currentsongnumber
        mediaPlayer = MediaPlayer.create(MainActivity.this, musicLists.get(currentSongNumber).getMusicFile());

        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        MainActivity.this.runOnUiThread(() -> {
//                    musicbar_artist.setText(musicLists.get(currentSongNumber).getArtist());
            musicbar_name.setText(musicLists.get(currentSongNumber).getTitle());
        });
        try {
            mediaPlayer.prepare();
            mediaPlayer.start();
        } catch (Exception e) {
            e.printStackTrace();
        }