0
votes

This is my MainActivity class;

private ArrayList<QuerySongs> songList = new ArrayList<>();
private boolean isShuffle = false;
private boolean isRepeat = false;
public static MediaPlayer mediaPlayer = new MediaPlayer();

RecyclerView recyclerView;
SongAdapter songAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
    if (recyclerView != null) {
        recyclerView.setHasFixedSize(true);
    }
    songAdapter = new SongAdapter(this, songList);
    recyclerView.setAdapter(songAdapter);
    songAdapter.notifyDataSetChanged();
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
    DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(), linearLayoutManager.getOrientation());
    recyclerView.setLayoutManager(linearLayoutManager);
    recyclerView.addItemDecoration(dividerItemDecoration);

    final TextView currSongTitle, currSongArtist;
    currSongTitle = (TextView) findViewById(R.id.currSongTitle);
    currSongArtist = (TextView) findViewById(R.id.currSongArtist);


    final RelativeLayout relativeLayoutCurr;
    relativeLayoutCurr = findViewById(R.id.relativeLayoutCurr);

    recyclerView.addOnItemTouchListener(new OnItemClickListeners(this, new OnItemClickListeners.OnItemClickListener() {
        @Override
        public void onItemClick(View view, int position) {
            final String songTitle = songList.get(position).getTitle();
            //final String filePath = songList.get(position).getData();
            final int songIndex = position;
            Toast.makeText(getApplicationContext(), "You Clicked " + songList.get(position).getData(), Toast.LENGTH_SHORT).show();
            try {
                mediaPlayer.reset();
                mediaPlayer.setDataSource(songList.get(songIndex).getData());
                mediaPlayer.prepareAsync();
                mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    @Override
                    public void onPrepared(MediaPlayer mp) {
                        mp.start();
                    }
                });

                currSongTitle.setText(songList.get(position).getTitle());
                currSongArtist.setText(songList.get(position).getArtist());
            }catch (Exception e){

                e.printStackTrace();

            }
           relativeLayoutCurr.setOnClickListener(new View.OnClickListener() {
               @Override
               public void onClick(View v) {
                   Intent currSong = new Intent(MainActivity.this, SongActivity.class);
                   currSong.putExtra("songIndex", songIndex);
                   currSong.putExtra("songTitle", songTitle);
                   //currSong.putExtra("filePath", filePath);
                   startActivity(currSong);
               }
           });
        }
    }));


    //Methode call controle voor toestemming lezen Storage
    checkUserPermission();

    //Methode call songs inlezen
    getSongs();

    //Sort songs
    Collections.sort(songList, new Comparator<QuerySongs>() {
        public int compare(QuerySongs a, QuerySongs b) {
            return a.getTitle().compareTo(b.getTitle());
        }
    });

}

//Songs inlezen
@TargetApi(Build.VERSION_CODES.O)
public void getSongs() {

        Uri songUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
        String selection = MediaStore.Audio.Media.IS_MUSIC + "!=0";
        Cursor myCursor = getContentResolver().query(songUri, null, selection, null, null);


        if (myCursor != null && myCursor.moveToFirst()) {
            int data_Column = myCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA);
            int id_Column = myCursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID);
            int title_Column = myCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE);
            int artist_Column = myCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST);
            int album_Column = myCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM);

            do {

                String songData = myCursor.getString(data_Column);
                Long songId = myCursor.getLong(id_Column);
                String songName = myCursor.getString(title_Column);
                String songArtist = myCursor.getString(artist_Column);
                String songAlbum = myCursor.getString(album_Column);

                QuerySongs querySongs = new QuerySongs(songData, songId, songName, songArtist, songAlbum);
                songList.add(querySongs);

            } while (myCursor.moveToNext());
            myCursor.close();
            songAdapter = new SongAdapter(this, songList);
        }
}

// Toestemming Storage lezen
private void checkUserPermission() {
    if (Build.VERSION.SDK_INT >= 23) {
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
            getSongs();
        }
    } else {
        checkUserPermission();
    }
}

@NonNull
@Override
public void onRequestPermissionsResult(int requestcode, @NonNull String[]
        permissions, @NonNull int[] grantResults) {
    switch (requestcode){
        case 1:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
                getSongs();
            }else{
                Toast.makeText(getApplicationContext(), "Permission Denied", Toast.LENGTH_SHORT).show();
                checkUserPermission();
                break;
            }
        default:
    }
    super.onRequestPermissionsResult(requestcode, permissions,
            grantResults);

}

@Override
protected void onDestroy() {
    super.onDestroy();
    mediaPlayer.stop();
    mediaPlayer.release();
}
}

And this is my next activity class to display the song;

private ArrayList<QuerySongs> songList = new ArrayList<>();
int songIndex = 0;
Button btnPlayPause, btnNext;
Bundle b;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_song);

    btnPlayPause = (Button) findViewById(R.id.btnPlayPause);
    btnNext = (Button) findViewById(R.id.btnNext);


    Intent currSong = getIntent();
    b = currSong.getExtras();

    btnPlayPause.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            try {
                if (mediaPlayer != null) {
                    if (mediaPlayer.isPlaying()) {
                        mediaPlayer.pause();
                        btnPlayPause.setText("Play");
                    } else {
                        mediaPlayer.start();
                        btnPlayPause.setText("Stop");
                    }
                    mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                        @Override
                        public void onCompletion(MediaPlayer mp) {
                            btnPlayPause.setText("Play");
                        }
                    });
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    });

    btnNext.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            int songIndex = (int) b.get("songIndex");
            //if(songIndex < songList.size() - 1) {
                songIndex = songIndex + 1;
                try {
                    mediaPlayer.reset();
                    mediaPlayer.setDataSource(songList.get(songIndex).getData());
                    mediaPlayer.prepareAsync();
                    mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                        @Override
                        public void onPrepared(MediaPlayer mp) {
                            mp.start();
                        }
                    });

                } catch (Exception e) {

                    e.printStackTrace();

                }
                Toast.makeText(getApplicationContext(), "You Clicked " + songIndex, Toast.LENGTH_SHORT).show();
            }
        //}
    });

    /*if (b != null) {
        String songTitle = (String) b.get("songTitle");
        getSupportActionBar().setTitle(songTitle);
    }*/

    }

So how can i play the next song in my songslist when i click on btnNext and display the current playing song in the actionbar?

When i click button next, the mediaplayer stops playing and a toast shows the current song position + 1, but it's not playing the next song?

Thanks,

-Vince

SongActivity

EDIT;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_song);

    btnPlayPause = (Button) findViewById(R.id.btnPlayPause);
    btnNext = (Button) findViewById(R.id.btnNext);
    recyclerView = (RecyclerView) findViewById(R.id.recyclerView);

    Intent currSong = getIntent();
    b = currSong.getExtras();

    btnPlayPause.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            try {
                if (mediaPlayer != null) {
                    if (mediaPlayer.isPlaying()) {
                        mediaPlayer.pause();
                        btnPlayPause.setText("Play");
                    } else {
                        mediaPlayer.start();
                        btnPlayPause.setText("Stop");
                    }
                    mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                        @Override
                        public void onCompletion(MediaPlayer mp) {
                            btnPlayPause.setText("Play");
                        }
                    });
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    });

    btnNext.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            recyclerView.findViewHolderForAdapterPosition(songIndex + 1).itemView.performClick();
            try {
                mediaPlayer.reset();
                mediaPlayer.setDataSource(songList.get(songIndex).getData());
                mediaPlayer.prepareAsync();
                mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    @Override
                    public void onPrepared(MediaPlayer mp) {
                        mp.start();
                    }
                });

            }catch (Exception e){

                e.printStackTrace();

            }
        }

    });

    if (b != null) {
        String songTitle = (String) b.get("songTitle");
        getSupportActionBar().setTitle(songTitle);
    }

}

}

So i made a global variable in my MainActivity and linked it to the position of my recyclerview and in my other activity i imported it.

Added this statement in my btnNext click listener; recyclerView.findViewHolderForAdapterPosition(songIndex + 1).itemView.performClick();

But now when i click next, the app crashes.

java.lang.NullPointerException: Attempt to invoke virtual method 'android.support.v7.widget.RecyclerView$ViewHolder android.support.v7.widget.RecyclerView.findViewHolderForAdapterPosition(int)' on a null object reference at com.vince_mp3player.mp3player.SongActivity$2.onClick(SongActivity.java:64)

p.s im new to java so im pretty sure i'm making a dumb mistake

Thanks in advance, -Vince

LOGCAT;

FATAL EXCEPTION: main Process: com.vince_mp3player.mp3player, PID: 29548 Theme: themes:{} java.lang.NullPointerException: Attempt to invoke virtual method 'android.support.v7.widget.RecyclerView$ViewHolder android.support.v7.widget.RecyclerView.findViewHolderForAdapterPosition(int)' on a null object reference at com.vince_mp3player.mp3player.SongActivity$2.onClick(SongActivity.java:65) at android.view.View.performClick(View.java:5204) at android.view.View$PerformClick.run(View.java:21159) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5475) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

1

1 Answers

1
votes

What i suggest is make a global variable which will keeps the hold to the current position and programmatically click the next item in the RecyclerView and to do that use

recyclerView.findViewHolderForAdapterPosition(currentPosition + 1).itemView.performClick();

put the above statement in the listener of the next button and it'll automatically call the RecyclerView's OnItemTouchListener and will play the next song.