i want to get song of particular album like when i click on an album i should get the songs of that album only. i m getting all albums and when i click on album,i m getting all the songs present on device.not of that album.so please tell me how to do that.i tried many stackoverflow answer but didnt get the answer.
public class albumSongs extends AppCompatActivity implements SearchView.OnQueryTextListener {
ArrayList<albumInfo>albumSongList=new ArrayList<>();
RecyclerView recyclerView2;
public albumsongAdapter albumsongAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_album_songs);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setTitle("try");
getSupportActionBar().setDisplayShowTitleEnabled(true);
recyclerView2 = (RecyclerView) findViewById(R.id.recyclerView2);
recyclerView2.setHasFixedSize(true);
albumsongAdapter = new albumsongAdapter(albumSongList,this);
SearchView searchView=(SearchView)findViewById(R.id.search);
recyclerView2.setAdapter(albumsongAdapter);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView2.getContext(),
linearLayoutManager.getOrientation());
recyclerView2.setLayoutManager(linearLayoutManager);
recyclerView2.addItemDecoration(dividerItemDecoration);
getSongsPerAlbum("");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
final MenuItem item = menu.findItem(R.id.search_view);
final SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);
searchView.setOnQueryTextListener(this);
searchView.setQueryHint("search songs");
MenuItemCompat.setOnActionExpandListener(item,new MenuItemCompat.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem menuItem) {
// Return true to allow the action view to expand
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem menuItem) {
// When the action view is collapsed, reset the query
albumsongAdapter.setSearchResult(albumSongList);
// Return true to allow the action view to collapse
return true;
}
});
return true;
}
public boolean onQueryTextSubmit(String query) {
return false;
}
public boolean onQueryTextChange(String newText) {
final List<albumInfo> filteredModelList = filter(albumSongList, newText);
albumsongAdapter.setSearchResult(filteredModelList);
return true;
}
private List<albumInfo> filter(ArrayList<albumInfo> models, String query) {
query = query.toLowerCase();
final List<albumInfo> filteredModelList = new ArrayList<>();
for (albumInfo model : models) {
final String text = model.getX().toLowerCase();
if (text.contains(query)) {
filteredModelList.add(model);
}
}
return filteredModelList;
}
public void getSongsPerAlbum(String AlbumId) {
final Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
final String track_id = MediaStore.Audio.Media._ID;
final String track_no = MediaStore.Audio.Media.TRACK;
final String track_name = MediaStore.Audio.Media.TITLE;
final String artist = MediaStore.Audio.Media.ARTIST;
final String duration = MediaStore.Audio.Media.DURATION;
final String album = MediaStore.Audio.Media.ALBUM;
final String albumid = MediaStore.Audio.Media.ALBUM_ID;
final String composer = MediaStore.Audio.Media.COMPOSER;
final String year = MediaStore.Audio.Media.YEAR;
final String path = MediaStore.Audio.Media.DATA;
final String date_added = MediaStore.Audio.Media.DATE_ADDED;
String[] columns = new String[]{
track_id,
track_no,
track_name,
artist,
duration,
album,
albumid,
composer,
year,
path,
date_added
};
// Get all tracks if no album id
Cursor csr;
if (AlbumId == null || AlbumId.length() < 1) {
csr = this.getContentResolver().query(uri, columns,null,null,track_no);
} else {
// Doesn't work think media has to be scanned first before albums are generated
csr = this.getContentResolver().query(uri, columns,album + "=?",new String[]{AlbumId},track_no);
}
for (String s: csr.getColumnNames()
) {
Log.d("SONGCOLUMN","Column = " + s);
}
while (csr.moveToNext()) {
String id = (csr.getString(csr.getColumnIndex(track_name)));
String thisalbumId=(csr.getString(csr.getColumnIndex(path)));
String v = (csr.getString(csr.getColumnIndex(albumid)));
Log.d("SONG","Name of Song is " + csr.getString(csr.getColumnIndex(track_name)) +
" from Album " + csr.getString(csr.getColumnIndex(album))
);
albumInfo s = new albumInfo(id, v, thisalbumId);
albumSongList.add(s);
}
csr.close();
// recyclerView2.setAdapter(albumsongAdapter);
}
}
i solved by doing this.
public class songAdapter extends RecyclerView.Adapter<songAdapter.SongHolder>{
private Context context;
MediaMetadataRetriever metaRetriver;
byte[] art;
private OnItemClickListener mOnItemClickListener;
private ArrayList<songInfo> _songs = new ArrayList<songInfo>();
public songAdapter(Context context, ArrayList<songInfo> songs) {
this.context = context;
this._songs = songs;
}
public interface OnItemClickListener {
void onItemClick(RecyclerView.ViewHolder holder, View view, songInfo obj, int position);
//void onItemClick(Button b, View view, songInfo obj, int position);
}
public void setOnItemClickListener(final OnItemClickListener mItemClickListener) {
this.mOnItemClickListener = mItemClickListener;
}
@Override
public SongHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View myView = LayoutInflater.from(context).inflate(R.layout.card, viewGroup, false);
return new SongHolder(myView);
}
@Override
public void onBindViewHolder(final SongHolder songHolder, final int i) {
final songInfo s = _songs.get(i);
metaRetriver = new MediaMetadataRetriever();
metaRetriver.setDataSource(_songs.get(i).getId());
try {
art = metaRetriver.getEmbeddedPicture();
Bitmap songImage = BitmapFactory.decodeByteArray(art, 0, art.length);
songHolder.album_art.setImageBitmap(songImage);
} catch (Exception e) {
// Drawable resId;
//resId = R.drawable.music;
songHolder.album_art.setBackgroundResource(R.drawable.music);
}
//final String filename = "android.resource://" + this.context + "/raw/test0";
songHolder.tvSongName.setText(_songs.get(i).getSongName());
songHolder.tvSongArtist.setText(_songs.get(i).getArtistName());
added this
/*
songHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(mOnItemClickListener!=null)
{
mOnItemClickListener.onItemClick(songHolder, view, s, i);
}
}
});*/
}
@Override
public int getItemCount() {
return _songs.size();
}
public class SongHolder extends RecyclerView.ViewHolder {
TextView tvSongName,tvSongArtist;
ImageView album_art;
SeekBar seekBar;
public SongHolder(View itemView) {
super(itemView);
tvSongName = itemView.findViewById(R.id.songName);
tvSongArtist = itemView.findViewById(R.id.artistName);
album_art = itemView.findViewById(R.id.albumArt);
seekBar=(SeekBar)itemView.findViewById(R.id.seekBar);
}
}
public void setSearchResult(List<songInfo> result) {
_songs = (ArrayList<songInfo>) result;
notifyDataSetChanged();
}
}