Dies ist meine MainActivity-Klasse;Wie spiele ich den nächsten Song onClick Button?
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();
}
}
Und das ist meine nächste Aktivitätsklasse das Lied anzuzeigen;
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 wie kann ich das nächste Lied in meinem songslist spielen, wenn ich auf btnNext klicken und den aktuellen Song im ActionBar angezeigt werden?
Wenn ich den nächsten Knopf klicke, hört der Mediaplayer auf zu spielen und ein Toast zeigt die aktuelle Songposition + 1 an, aber es spielt nicht den nächsten Song?
Danke,
-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);
}
}
}
Also habe ich eine globale Variable in meinem MainActivity und verknüpfen sie in die Position meines recyclerview und in meiner anderen Tätigkeit, die ihn i importiert.
Diese Anweisung wurde in meinem btnNext click listener hinzugefügt; recyclerView.findViewHolderForAdapterPosition (songIndex + 1) .itemView.performClick();
Aber jetzt, wenn ich auf "Weiter" klicke, stürzt die App ab.
java.lang.NullPointerException: Der Versuch, virtuelle Methode 'android.support.v7.widget.RecyclerView $ ViewHolder android.support.v7.widget.RecyclerView.findViewHolderForAdapterPosition (int)' auf einer Null-Objekt Referenz bei aufzurufen com .vince_mp3player.mp3player.SongActivity $ 2.onClick (SongActivity.java:64)
ps im neu in Java so im ziemlich sicher, dass ich mache einen dummen Fehler
Vielen Dank im Voraus, -Vince
LOGCAT;
FATAL AUSNAHME: Haupt Prozess: com.vince_mp3player.mp3player, PID: 29548 Thema: Themen: {} java.lang.NullPointerException: Der Versuch, virtuelle Methode aufzurufen ‚android.support.v7.widget.RecyclerView $ ViewHolder android.support.v7.widget.RecyclerView.findViewHolderForAdapterPosition (int) 'auf einer Null-Objekt-Referenz bei com.vince_mp3player.mp3player.SongActivity $ 2.onClick (SongActivity.java:65) bei android.view.View.performClick (View.java:5204) bei android.view.View $ PerformClick.run (View.java:21159) bei android.os.Handler.h andleCallback (Handler.java:739) bei android.os.Handler.dispatchMessage (Handler.java:95) bei android.os.Looper.loop (Looper.java:148) bei android.app.ActivityThread.main (ActivityThread.java:5475) bei java.lang.reflect.Method.aufrufen (native Methode) bei com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:726) bei com.android.internal.os.ZygoteInit.main (ZygoteInit.java:616)
Ich habe Ihre Anweisung in meinem btnNext-Listener hinzugefügt und eine globale Variable songIndex erstellt und diese mit der Position meiner Recyclerview in MainActivity verknüpft (songIndex = position). Aber jetzt stürzt die App ab, wenn ich die nächste Taste drücke. (Sehen Sie sich den bearbeiteten Post an) – Vince
Als erstes haben Sie die Indexvariable wie diese 'final int songIndex = position;' im OnTouchListener deklariert. Was global gemeint ist, war eine Variable vor onCreate zu definieren und ihr Wert wird jedes Mal aktualisiert, wenn auf ein Recycler-View-Element geklickt wird. Und Button OnClickListener kann diesen Wert lesen und entsprechend handeln. Und wenn das Problem weiterhin besteht, fügen Sie bitte auch das Logcat hinzu. –
Ja, ich habe eine globale Variable oberhalb von onCreate erstellt (public static int songIndex;), dann bin ich in meinem recyclerView.addOnItemTouchListener mit position (songIndex = position;) verbunden und habe dann die Anweisung in meine andere Aktivität in btnNext onClick listener hinzugefügt. (Logcat in Post) – Vince