Search code examples
androidmedia-player

How to stop mediaplayer which continues to play after closing the activity


I have set up MediaPlayer to play list of music files from raw folder. This music player has pause and play buttons. the songs are listed using RecyclerView.

My challenge is whenever i exit activity the activity, music continues to play without stopping automatically. Please help me i want the music player to stop on activity close.

This is CustomMusicAdapter

public class CustomMusicAdapter extends RecyclerView.Adapter<MyViewHolder> implements Filterable {

    private Context context;
    private int layout;
    private ArrayList<Music> myArraylist;
    private ArrayList<Music> getUserModelListFiltered;
    private static MediaPlayer mediaPlayer;
    private boolean flag=true;


    public CustomMusicAdapter(Context context, int custom_music_row, ArrayList<Music> myArraylist) {
        this.context = context;
        this.layout = layout;
        this.getUserModelListFiltered = myArraylist;
        this.myArraylist = myArraylist;

    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        final View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.custom_music_row, parent, false);
        return new MyViewHolder(itemView);
    }



    @SuppressLint("RecyclerView")
    @Override
    public void onBindViewHolder(@NonNull final MyViewHolder holder, final int position) {
        holder.setIsRecyclable(false);

        final Music music = myArraylist.get(position);
        holder.mTitle.setText(music.getName());
        holder.mDes.setText(music.getSinger());

        //Play Music Setup
        holder.mImageaplay.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                if (flag){
                    mediaPlayer=MediaPlayer.create(context,music.getSong());
                    flag=false;
                }
                if (mediaPlayer.isPlaying()){
                    mediaPlayer.pause();
                    mediaPlayer.start();
                    holder.mImageaplay.setImageResource(R.drawable.ic_play);
                }else {
                    mediaPlayer.start();
                    holder. mImageaplay.setImageResource(R.drawable.ic_pause);
                }
                mediaPlayer.start();

            }
        });

        // stop player
        holder.mImageStop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (!flag){
                    mediaPlayer.stop();
                    mediaPlayer.release();
                    flag=true;
                }
                holder.mImageaplay.setImageResource(R.drawable.ic_play);
            }
        });

    }

    @Override
    public int getItemCount() {
        return myArraylist.size();
    }

    @Override
    public Filter getFilter() {

        Filter filter = new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence charSequence) {
                FilterResults filterResults = new FilterResults();
                if (charSequence == null | charSequence.length() == 0){
                    filterResults.count = getUserModelListFiltered.size();
                    filterResults.values = getUserModelListFiltered;
                }else {
                    String searchChr = charSequence.toString().toLowerCase();
                    List<Music> resultData = new ArrayList<>();
                    for (Music music: getUserModelListFiltered){
                        if (music.getName().toLowerCase().contains(searchChr)){
                            resultData.add(music);
                        }
                    }
                    filterResults.count = resultData.size();
                    filterResults.values = resultData;
                }
                return filterResults;
            }

            @Override
            protected void publishResults(CharSequence charSequence, FilterResults filterResults) {

                myArraylist = (ArrayList<Music>) filterResults.values;
                notifyDataSetChanged();

            }
        };
        return filter;
    }

    public class ViewHolder {
        TextView textView_SongName, textView_artist;
        ImageView imageView_play, imageView_stop;
        private View convertview;
        LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);

        public ViewHolder() {
            convertview = layoutInflater.inflate(layout, null);
            textView_SongName = convertview.findViewById(R.id.textName);
            textView_artist = convertview.findViewById(R.id.txtSinger);
            imageView_play = convertview.findViewById(R.id.ivPlay);
            imageView_stop = convertview.findViewById(R.id.ivStop);

        }
    }
}

This how i placed it in the code Is it right?

// stop player
        holder.mImageStop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (!flag){
                    mediaPlayer.stop();
                    mediaPlayer.release();
                    flag=true;
                }
                public void onDestroy(){
                    if( CustomMusicAdapter !=null ){
                        CustomMusicAdapter.release()
                    }
                }
                holder.mImageaplay.setImageResource(R.drawable.ic_play);

            }
        });

Tip1Activity.java

public class Tip1Activity extends AppCompatActivity {
    private ArrayList<Music> arrayList;
    private CustomMusicAdapter adapter;
    private RecyclerView recyclerView;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tip1);



        Button button1 = (Button)findViewById(R.id.mainButton1);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(Tip1Activity.this, MainActivity.class);
                i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(i);
                Toast.makeText(Tip1Activity.this, "songs!", Toast.LENGTH_SHORT).show();
            }
        });

      

        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

        recyclerView =  findViewById(R.id.recyclerViewList);

        arrayList = new ArrayList<>();
        arrayList.add(new Music("001 Veni, veni, Emmanuel", "SONGS OF WORSHIP", R.raw.veni_emmanuel));
        arrayList.add(new Music("002 O come. O come Emmanuel", "SONGS OF WORSHIP", R.raw.o_come_emmanuel));
        arrayList.add(new Music("003 Savior of the nations, come", "SONGS OF WORSHIP", R.raw.savior_of_nations));
        arrayList.add(new Music("004 On Jordan's bank the Baptist's cry", "SONGS OF WORSHIP", R.raw.on_jordans_bank));
        arrayList.add(new Music("005 Lo, he comes", "SONGS OF WORSHIP", R.raw.lo_he_comes));
        arrayList.add(new Music("006 O Word that goest forth on high", "SONGS OF WORSHIP", R.raw.o_word_that_goes_forth));
        arrayList.add(new Music("007 Wake, awake", "SONGS OF WORSHIP", R.raw.wake_awake));
        arrayList.add(new Music("008 Rorate caeli", "SONGS OF WORSHIP", R.raw.rorate_caeli));
        arrayList.add(new Music("009 Conditor alme siderum", "SONGS OF WORSHIP", R.raw.conditor_alme_siderum));
        arrayList.add(new Music("010 Creator of the stars of night", "SONGS OF WORSHIP", R.raw.creator_of_the_stars));



        adapter = new CustomMusicAdapter(this, R.layout.custom_music_row, arrayList);
        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setHasFixedSize(false);

    }

   }

    @Override
    public void onBackPressed() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setMessage("Do you want to close Catholic Mass Songs App?")
                .setCancelable(false)
                .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        Tip1Activity.this.finish();
                    }
                })
                .setNegativeButton("No", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        dialog.cancel();
                    }
                });
        AlertDialog alert = builder.create();
        alert.show();

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_options, menu);

        MenuItem menuItem = menu.findItem(R.id.search_view);

        SearchView searchView = (SearchView) menuItem.getActionView();

        searchView.setMaxWidth(Integer.MAX_VALUE);

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {

                adapter.getFilter().filter(newText);
                return true;
            }
        });



        return  true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){

            case R.id.item1:
                Toast.makeText(this, "Settings Selected", Toast.LENGTH_SHORT).show();
                startActivity(new Intent(this, Main2Activity.class));
                return true;

            //do more funtionality here

                


            default:
                return super.onOptionsItemSelected(item);
        }

    }
}

Images of code error

Code error from Tip1Activity code error from adapter


Solution

  • Create a method in the adapter :

    public class CustomMusicAdapter extends RecyclerView.Adapter<MyViewHolder> implements Filterable {
    
        private Context context;
        private int layout;
        private ArrayList<Music> myArraylist;
        private ArrayList<Music> getUserModelListFiltered;
        private static MediaPlayer mediaPlayer;
        private boolean flag=true;
    
    
        public CustomMusicAdapter(Context context, int custom_music_row, ArrayList<Music> myArraylist) {
            this.context = context;
            this.layout = layout;
            this.getUserModelListFiltered = myArraylist;
            this.myArraylist = myArraylist;
    
        }
    
         public release(){
                mediaPlayer.stop();
                mediaPlayer.release();
         }
    
    
        @NonNull
        @Override
        public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            final View itemView = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.custom_music_row, parent, false);
            return new MyViewHolder(itemView);
        }
    
    
    
        @SuppressLint("RecyclerView")
        @Override
        public void onBindViewHolder(@NonNull final MyViewHolder holder, final int position) {
            holder.setIsRecyclable(false);
    
            final Music music = myArraylist.get(position);
            holder.mTitle.setText(music.getName());
            holder.mDes.setText(music.getSinger());
    
            //Play Music Setup
            holder.mImageaplay.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
    
                    if (flag){
                        mediaPlayer=MediaPlayer.create(context,music.getSong());
                        flag=false;
                    }
                    if (mediaPlayer.isPlaying()){
                        mediaPlayer.pause();
                        mediaPlayer.start();
                        holder.mImageaplay.setImageResource(R.drawable.ic_play);
                    }else {
                        mediaPlayer.start();
                        holder. mImageaplay.setImageResource(R.drawable.ic_pause);
                    }
                    mediaPlayer.start();
    
                }
            });
    
            // stop player
            holder.mImageStop.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (!flag){
                        mediaPlayer.stop();
                        mediaPlayer.release();
                        flag=true;
                    }
                    holder.mImageaplay.setImageResource(R.drawable.ic_play);
                }
            });
    
        }
    
        @Override
        public int getItemCount() {
            return myArraylist.size();
        }
    
        @Override
        public Filter getFilter() {
    
            Filter filter = new Filter() {
                @Override
                protected FilterResults performFiltering(CharSequence charSequence) {
                    FilterResults filterResults = new FilterResults();
                    if (charSequence == null | charSequence.length() == 0){
                        filterResults.count = getUserModelListFiltered.size();
                        filterResults.values = getUserModelListFiltered;
                    }else {
                        String searchChr = charSequence.toString().toLowerCase();
                        List<Music> resultData = new ArrayList<>();
                        for (Music music: getUserModelListFiltered){
                            if (music.getName().toLowerCase().contains(searchChr)){
                                resultData.add(music);
                            }
                        }
                        filterResults.count = resultData.size();
                        filterResults.values = resultData;
                    }
                    return filterResults;
                }
    
                @Override
                protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
    
                    myArraylist = (ArrayList<Music>) filterResults.values;
                    notifyDataSetChanged();
    
                }
            };
            return filter;
        }
    
        public class ViewHolder {
            TextView textView_SongName, textView_artist;
            ImageView imageView_play, imageView_stop;
            private View convertview;
            LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
    
            public ViewHolder() {
                convertview = layoutInflater.inflate(layout, null);
                textView_SongName = convertview.findViewById(R.id.textName);
                textView_artist = convertview.findViewById(R.id.txtSinger);
                imageView_play = convertview.findViewById(R.id.ivPlay);
                imageView_stop = convertview.findViewById(R.id.ivStop);
    
            }
        }
    }
    

    override activity onDestroy() method

     public class Tip1Activity extends AppCompatActivity {
            private ArrayList<Music> arrayList;
            private CustomMusicAdapter adapter;
            private RecyclerView recyclerView;
        
        
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_tip1);
        
        
        
                Button button1 = (Button)findViewById(R.id.mainButton1);
                button1.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent i = new Intent(Tip1Activity.this, MainActivity.class);
                        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                        startActivity(i);
                        Toast.makeText(Tip1Activity.this, "songs!", Toast.LENGTH_SHORT).show();
                    }
                });
        
              
        
                getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        
                recyclerView =  findViewById(R.id.recyclerViewList);
        
                arrayList = new ArrayList<>();
                arrayList.add(new Music("001 Veni, veni, Emmanuel", "SONGS OF WORSHIP", R.raw.veni_emmanuel));
                arrayList.add(new Music("002 O come. O come Emmanuel", "SONGS OF WORSHIP", R.raw.o_come_emmanuel));
                arrayList.add(new Music("003 Savior of the nations, come", "SONGS OF WORSHIP", R.raw.savior_of_nations));
                arrayList.add(new Music("004 On Jordan's bank the Baptist's cry", "SONGS OF WORSHIP", R.raw.on_jordans_bank));
                arrayList.add(new Music("005 Lo, he comes", "SONGS OF WORSHIP", R.raw.lo_he_comes));
                arrayList.add(new Music("006 O Word that goest forth on high", "SONGS OF WORSHIP", R.raw.o_word_that_goes_forth));
                arrayList.add(new Music("007 Wake, awake", "SONGS OF WORSHIP", R.raw.wake_awake));
                arrayList.add(new Music("008 Rorate caeli", "SONGS OF WORSHIP", R.raw.rorate_caeli));
                arrayList.add(new Music("009 Conditor alme siderum", "SONGS OF WORSHIP", R.raw.conditor_alme_siderum));
                arrayList.add(new Music("010 Creator of the stars of night", "SONGS OF WORSHIP", R.raw.creator_of_the_stars));
        
        
        
                adapter = new CustomMusicAdapter(this, R.layout.custom_music_row, arrayList);
                recyclerView.setAdapter(adapter);
                recyclerView.setLayoutManager(new LinearLayoutManager(this));
                recyclerView.setHasFixedSize(false);
        
            }
        
         
        
        onDestroy() {
          if( adapter !=null ){
            adapter.release()
          }
        }
        
            @Override
            public void onBackPressed() {
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setMessage("Do you want to close Catholic Mass Songs App?")
                        .setCancelable(false)
                        .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                Tip1Activity.this.finish();
                            }
                        })
                        .setNegativeButton("No", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                dialog.cancel();
                            }
                        });
                AlertDialog alert = builder.create();
                alert.show();
        
            }
        
            @Override
            public boolean onCreateOptionsMenu(Menu menu) {
                getMenuInflater().inflate(R.menu.menu_options, menu);
        
                MenuItem menuItem = menu.findItem(R.id.search_view);
        
                SearchView searchView = (SearchView) menuItem.getActionView();
        
                searchView.setMaxWidth(Integer.MAX_VALUE);
        
                searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
                    @Override
                    public boolean onQueryTextSubmit(String query) {
                        return false;
                    }
        
                    @Override
                    public boolean onQueryTextChange(String newText) {
        
                        adapter.getFilter().filter(newText);
                        return true;
                    }
                });
        
        
        
                return  true;
            }
        
            @Override
            public boolean onOptionsItemSelected(MenuItem item) {
                switch (item.getItemId()){
        
                    case R.id.item1:
                        Toast.makeText(this, "Settings Selected", Toast.LENGTH_SHORT).show();
                        startActivity(new Intent(this, Main2Activity.class));
                        return true;
        
                    //do more funtionality here
        
                        
        
        
                    default:
                        return super.onOptionsItemSelected(item);
                }
        
            }
        }