2017-11-28 2 views
0

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)

Antwort

1

Was ich vorschlagen, ist eine globale Variable machen, die in die Hold auf die aktuelle Position hält und programmatisch das nächste Element in der RecyclerView klicken und dass die Verwendung

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

setzten die obige Aussage in dem Hörer der nächsten Taste zu tun und es ruft automatisch den OnItemTouchListener von RecyclerView auf und spielt das nächste Lied ab.

+0

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

+0

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. –

+0

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

Verwandte Themen