0

I have a SeekBar and some MediaFiles fetched from sd card. Below is the code I wrote to play MediaFile and to progress SeekBar according to MediaFile position, but when I click on the item in the ListView, it does nothing and nothing starts. I don't know whats wrong with this code. Help!! Let me know if you want other information.

  songAdapter1.setOnItemClickListener(new songAdapter.OnItemClickListener() {
                @Override
                public void onItemClick(RecyclerView.ViewHolder holder, View view, final songInfo obj, int position) {
                    if(mediaPlayer.isPlaying()){
                        mediaPlayer.stop();
                        mediaPlayer.reset();
                        mediaPlayer.release();
                        mediaPlayer = null;

                    }else {

                        Runnable runnable = new Runnable() {
                            @Override
                            public void run() {
                                try {
                                    mediaPlayer = new MediaPlayer();
                                    mediaPlayer.setDataSource(obj.getSongUrl());
                                    mediaPlayer.prepareAsync();
                                    mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                                        @Override
                                        public void onPrepared(MediaPlayer mp) {
                                            mp.start();
                                            seekBar.setProgress(0);
                                            seekBar.setMax(mediaPlayer.getDuration());
                                            Log.d("Prog", "run: " + mediaPlayer.getDuration());
                                        }
                                    });




                                }catch (Exception e){}
                            }

                        };
                        myHandler.postDelayed(runnable,100);

                    }
                }


            });
            checkUserPermission();

            Thread t = new runThread();
            t.start();
            return rootView;
        }

            class runThread extends Thread {
                @Override
                public void run() {
                    while (true) {
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        Log.d("Runwa", "run: " + 1);
                        if (mediaPlayer != null) {
                            seekBar.post(new Runnable() {
                                @Override
                                public void run() {
                                    seekBar.setProgress(mediaPlayer.getCurrentPosition());
                                }
                            });

                            Log.d("Runwa", "run: " + mediaPlayer.getCurrentPosition());
                        }
                    }
                }
            }

    package com.example.murarilal.atry;

    public  class songAdapter extends RecyclerView.Adapter<songAdapter.SongHolder> {
        private Context context;
        MediaMetadataRetriever metaRetriver;
        byte[] art;
        MediaPlayer m;
        Handler mHandler;
        private OnItemClickListener mOnItemClickListener;
        private ArrayList<songInfo> _songs = new ArrayList<songInfo>();
        SeekBar seekbar;
        Handler handler;
        MediaPlayer mp;
        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);
            }
            setOnItemClickListener(new OnItemClickListener() {
                @Override
                public void onItemClick(RecyclerView.ViewHolder holder, View view, songInfo obj, int position) {
                    if (mOnItemClickListener != null) {
                        mOnItemClickListener.onItemClick(songHolder, view, s, i);
                    }

                }
            });
            //final String filename = "android.resource://" + this.context + "/raw/test0";
            songHolder.tvSongName.setText(_songs.get(i).getSongName());
            songHolder.tvSongArtist.setText(_songs.get(i).getArtistName());
            songHolder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                }

            });
        }

        @Override
        public int getItemCount() {
            return _songs.size();
        }
        public class SongHolder extends RecyclerView.ViewHolder {
            TextView tvSongName,tvSongArtist;
            ImageView album_art;
            public SongHolder(View itemView) {
                super(itemView);
                tvSongName = (TextView) itemView.findViewById(R.id.songName);
                tvSongArtist = (TextView) itemView.findViewById(R.id.artistName);
                album_art = (ImageView) itemView.findViewById(R.id.albumArt);
                seekbar=itemView.findViewById(R.id.seekBar);
            }
        }
        public void setSearchResult(List<songInfo> result) {
            _songs = (ArrayList<songInfo>) result;
            notifyDataSetChanged();
        }
    }
Masoud Mokhtari
  • 2,390
  • 1
  • 17
  • 45

1 Answers1

0

You haven't added properly added code for updating your seekbar value. Try with the below code

    private Runnable UpdateSongTime = new Runnable() {
      public void run() {
         startTime = mediaPlayer.getCurrentPosition();
         tx1.setText(String.format("%d min, %d sec",
            TimeUnit.MILLISECONDS.toMinutes((long) startTime),
            TimeUnit.MILLISECONDS.toSeconds((long) startTime) -
            TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.
            toMinutes((long) startTime)))
         );
         seekbar.setProgress((int)startTime);

      }
   };

Also you don't have to add prepared listener method inside the runnable. Place that method outside of runnable and simply call the above runnable code from the PreparedListener method

To call the handler use the below code

myHandler.postDelayed(UpdateSongTime , 100);

Vivek Mishra
  • 5,669
  • 9
  • 46
  • 84