2017-11-28 3 views
0

これは私の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)

答えて

1

何私がお勧めするでしょうが、現在の位置にホールドを保持し、プログラムRecyclerViewの次の項目をクリックすると、その利用を行うために

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

は、次のボタンのリスナーに上記の文を置くグローバル変数を作成していますRecyclerViewのOnItemTouchListenerを自動的に呼び出して、次の曲を再生します。

+0

私のbtnNextリスナー内にあなたのステートメントを追加し、グローバル変数songIndexを作成し、MainActivity(songIndex = position)の私のrecyclerviewの位置にリンクしましたが、次のボタンを押すとアプリケーションがクラッシュするようになりました。 (編集済みの記事を見てください) – Vince

+0

最初のことは、OnTouchListener内でこの 'final int songIndex = position;'のようなインデックス変数を宣言したことです。私が意図したことは、onCreateの前に変数を定義することでした。リサイクラーの表示アイテムがクリックされるたびに値が更新されます。ボタンOnClickListenerはその値を読み取り、それに応じて動作します。それでも問題が解決しない場合は、logcatを追加してください。 –

+0

ええ、私は上記のグローバル変数を作成しましたonCreate(public static int songIndex;)、次に私のrecyclerView.addOnItemTouchListenerで私はそれをposition(songIndex = position;)にリンクし、次にbtnNext onClickリスナーの他のアクティビティでステートメントを追加しました。 (Logcatのポスト) – Vince

関連する問題