Search code examples
androidmedia-queriesandroid-mediaplayer

how do i get songs of particular album only


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);
    }


}

Solution

  • 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();
            }
        }