これは私のMainActivityクラスです。次の曲onClickボタンの再生方法は?
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();
}
}
そして、これが曲を表示するには、私の次のアクティビティクラスです。
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);
}*/
}
したがって、btnNextをクリックして現在の再生曲をアクションバーに表示すると、曲リストで次の曲を再生するにはどうすればよいですか?
私が次のボタンをクリックすると、メディアプレイヤーの再生が停止し、トーストに現在の曲の位置+1が表示されますが、次の曲は再生されませんか?
おかげで、
-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);
}
}
}
だから、私はMainActivityでグローバル変数を作って、私のrecyclerviewの位置にし、私はそれを輸入し、私の他の活動でそれをリンクさ。
この文を自分のbtnNextクリックリスナーに追加しました。 recyclerView.findViewHolderForAdapterPosition(songIndex + 1).itemView.performClick();
しかし、今すぐ次をクリックすると、アプリがクラッシュします。
のjava.lang.NullPointerException:COMでnullオブジェクト参照 上の仮想メソッドを呼び出すための試み 'android.support.v7.widget.RecyclerView $ ViewHolder android.support.v7.widget.RecyclerView.findViewHolderForAdapterPosition(int型)' .vince_mp3player.mp3player.SongActivity $ 2.onClick(SongActivity.java:64)私は事前にダムのミスに
感謝を作ってるんだかなり確信しそうイムJavaへの新しい
PSイム、 -Vince
LOGCAT;
致命的な例外:メイン プロセス:com.vince_mp3player.mp3player、PID:29548 テーマ:テーマ:{} java.lang.NullPointerExceptionが仮想メソッドを起動しようと「android.support.v7.widget.RecyclerView $ nullオブジェクト参照の場合はViewHolder android.support.v7.widget.RecyclerView.findViewHolderForAdapterPosition(int) 'com.vince_mp3player.mp3player.SongActivity $ 2.onClick(SongActivity.java:65) android.view.View.performClick()で View.java:5204) android.view.View $ PerformClick.run(View.java:21159) android.os.Handler.h andleCallback(Handler.java:739) (andler.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) android.app.ActivityThread.main ActivityThread.java:5475) at java.lang.reflect.Method。com.android.internal.os.ZygoteInit.mainでcom.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:726) で を(ネイティブメソッド)を呼び出す(ZygoteInit.java:616)
私のbtnNextリスナー内にあなたのステートメントを追加し、グローバル変数songIndexを作成し、MainActivity(songIndex = position)の私のrecyclerviewの位置にリンクしましたが、次のボタンを押すとアプリケーションがクラッシュするようになりました。 (編集済みの記事を見てください) – Vince
最初のことは、OnTouchListener内でこの 'final int songIndex = position;'のようなインデックス変数を宣言したことです。私が意図したことは、onCreateの前に変数を定義することでした。リサイクラーの表示アイテムがクリックされるたびに値が更新されます。ボタンOnClickListenerはその値を読み取り、それに応じて動作します。それでも問題が解決しない場合は、logcatを追加してください。 –
ええ、私は上記のグローバル変数を作成しましたonCreate(public static int songIndex;)、次に私のrecyclerView.addOnItemTouchListenerで私はそれをposition(songIndex = position;)にリンクし、次にbtnNext onClickリスナーの他のアクティビティでステートメントを追加しました。 (Logcatのポスト) – Vince