【问题标题】:How to stop mediaplayer which continues to play after closing the activity如何在关闭活动后停止继续播放的媒体播放器
【发布时间】:2020-06-24 17:59:09
【问题描述】:

我已将 MediaPlayer 设置为播放原始文件夹中的音乐文件列表。这个音乐播放器有暂停和播放按钮。歌曲使用 RecyclerView 列出。

我的挑战是每当我退出活动时,音乐会继续播放而不会自动停止。 请帮助我,我希望音乐播放器在活动关闭时停止。

这是 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);

        }
    }
}

这就是我在代码中放置它的方式 对吗?

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

    }
}

代码错误图片

【问题讨论】:

    标签: android media-player


    【解决方案1】:

    在适配器中创建一个方法:

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

    覆盖活动 onDestroy() 方法

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

    【讨论】:

    • 我遇到了错误,你能告诉我更多的重点
    • 我如何将它放在给我错误的代码中已粘贴在 OP 中。请我粘贴我所做的,这给了我上面的错误。谢谢你帮助我
    • 从 onclick 中删除它。 public void onDestroy(){ if( CustomMusicAdapter !=null ){ CustomMusicAdapter.release() } } 从您调用适配器的位置。 onDestroy 是一个活动/片段方法。您需要在活动或片段中覆盖。
    • 你能分享你调用adater的活动代码吗
    • 是的先生,我已经发布了上面的活动
    【解决方案2】:

    使用带有 RecyclerView 适配器的界面,这样当您单击播放按钮时,您会在界面中发送原始文件的 id(例如:R.raw.o_word_that_goes_forth),您可以在活动中使用comman媒体播放器,现在onDistroy方法你可以停止媒体播放器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多