Member 13772817 Ответов: 1

Как остановить музыку при выходе из экрана?


у меня есть список воспроизведения listview с mediaplayer в musicAdapter.каждый элемент из списка имеет воспроизведение/паузу и остановку btn.когда вы нажимаете кнопку воспроизведения, она меняется на паузу и другой способ.stop btn останавливает музыку и меняет кнопку паузы на воспроизведение.
Это мой musicAdapter:
<pre lang="java">package com.example.android.musicapp;

import android.content.Context;
import android.media.MediaPlayer;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;

public class MusicAdapter extends BaseAdapter {
    private Context context;
    private int layout;
    private int currentPosition;
    private ArrayList arrayList;
    private MediaPlayer mediaPlayer;
    private boolean flag = true;
    private ImageView currentPlayingButton;

    public MusicAdapter(Context context, int layout, ArrayList<Music> arrayList) {
        this.context = context;
        this.layout = layout;
        this.arrayList = arrayList;
    }


    @Override
    public int getCount() {
        return arrayList.size();
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    private class Holder {
        TextView textName, textAlbum;
        ImageView play, stop;
    }


    @Override
    public View getView(final int pos, View convertView, final ViewGroup parent) {
        final Holder holder;
        final int position = pos;
        if (convertView == null) {
            holder = new Holder();
            LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = layoutInflater.inflate(layout, null);
            holder.textName = (TextView) convertView.findViewById(R.id.textName);
            holder.textAlbum = (TextView) convertView.findViewById(R.id.textAlbum);
            holder.play = convertView.findViewById(R.id.play);
            holder.stop = convertView.findViewById(R.id.stop);
            currentPlayingButton = holder.play;
            convertView.setTag(holder);
        } else {
            holder = (Holder) convertView.getTag();

        }


        final Music music = (Music) arrayList.get(position);
        holder.textName.setText(music.getName());
        holder.textAlbum.setText(music.getAlbum());

        holder.play.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                if (mediaPlayer == null) {

                    mediaPlayer = MediaPlayer.create(context, music.getSong());
                    mediaPlayer.start();
                    currentPosition = position;
                    holder.play.setImageResource(R.drawable.pause);
                    currentPlayingButton = holder.play;
                } else {
                    if (currentPosition != position) {

                        mediaPlayer.reset();
                        mediaPlayer.release();
                        currentPlayingButton.setImageResource(R.drawable.ic_play);
                        currentPlayingButton = holder.play;


                        mediaPlayer = MediaPlayer.create(context, music.getSong());
                        mediaPlayer.start();
                        currentPlayingButton.setImageResource(R.drawable.pause);
                        currentPlayingButton = holder.play;
                        currentPosition = position;
                    } else {
                        if (mediaPlayer.isPlaying()) {
                            Log.v("Adapter", "mediaPlayer should be playing here" + mediaPlayer.isPlaying());
                            mediaPlayer.pause();
                            holder.play.setImageResource(R.drawable.ic_play);
                            Log.v("Adapter", "user clicked the same row and isPlaying");
                            Log.v("Adapter", "" + currentPosition);
                            Log.v("Adapter", "mediaPlayer shouldn't be playing here" + mediaPlayer.isPlaying());

                        } else {
                            Log.v("Adapter", "mediaPlayer shouldn't be playing here" + mediaPlayer.isPlaying());
                            mediaPlayer.start();
                            holder.play.setImageResource(R.drawable.pause);
                            Log.v("Adapter", "current pos == pos and !isPlaying");
                            Log.v("Adapter", "" + currentPosition);
                            Log.v("Adapter", "mediaPlayer should be playing here" + mediaPlayer.isPlaying());
                        }
                    }
                }

            }
        });


        holder.stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mediaPlayer != null) {

                    mediaPlayer.stop();
                    mediaPlayer.release();
                    mediaPlayer = null;
                    holder.play.setImageResource(R.drawable.ic_play);

                }
            }

        });


        return convertView;


    }
   
    {

}}


у меня есть 2 проблемы:1) я установил свою кнопку воспроизведения/паузы, чтобы она также менялась при нажатии другой кнопки воспроизведения btn из другой позиции.Это работает только в том случае,что помимо позиции 6,7 и 8, независимо от того, на какой позиции вы нажимаете кнопку воспроизведения, появляется еще одна игра btn из другой позиции с возможностью паузы, хотя музыка остается той, на которую мы нажали, и 2) я, кажется, не понимаю, как остановить воспроизведение музыки, когда нажата кнопка Назад или домой или меняется экран.

Что я уже пробовал:

для остановки музыки при смене экранов и т. д. Я пробовал:
public void stopMusic() {
        if(mediaPlayer != null){
               mediaPlayer.stop();
               mediaPlayer.release();
               mediaPlayer = null;
               holder.play.setImageResource(R.drawable.ic_play);
        }
    }


я положил его в свой держатель.stop.setOnClickListener(...)

David Crow

Что касается вашей первой проблемы, то вы могли бы попробовать следующее:

// in the getView() method:
holder.play.setTag(Integer.valueOf(position));

// in the onClick() method:
Integer pos = (Integer) v.getTag();
Music music = arrayList.get(pos.intValue());
Другой вариант может быть:
// in the getView() method:
holder.play.setTag(music);

// in the onClick() method:
Music music = (Music) v.getTag();
"...я, кажется, не понимаю, как остановить воспроизведение музыки, когда нажата кнопка "Назад" или "домой" или меняется экран."

Ты звонишь mediaPlayer.stop() в методе деятельности, таком как onPause(), onStop(), или onDestroy()?

Member 13772817

i не работает в обоих случаях ошибка "несовместимые типы"

Member 13772817

я попробовал это сделать*
public void stopMusic() {
if(mediaPlayer != null){
медиаплеер.стоп();
медиаплеер.релиз();
mediaPlayer = null;
holder.play.setImageResource(R. drawable.ic_play);
}
}
*в holder.stop.setOnClickListener не работает и это*
общественного недействительными вызовом onStop() {
if(mediaPlayer != null){
медиаплеер.стоп();
медиаплеер.релиз();
mediaPlayer = null;

}
}
*последнее в моем коде не сработало.я прочитал почти все об этом.и посмотрел другие ответы,но все, что я пытаюсь, не работает

1 Ответов

Рейтинг:
2

Richard MacCutchan

Вам нужно зафиксировать события паузы или остановки вашего приложения. Затем вы можете остановить плеер до того, как ваше приложение будет помещено в фоновый режим. видеть Жизненный Цикл Активности | Разработчики Android[^].


Member 13772817

Спасибо! вы знаете, почему возникает моя первая проблема?

Richard MacCutchan

Я не совсем понимаю другую проблему. Вы упомянули несколько кнопок воспроизведения - откуда они берутся?

Member 13772817

У меня есть список песен,у каждой из них есть кнопка воспроизведения и остановки.когда вы нажимаете кнопку play,кнопка меняется на pause и начинается музыка,но также и другое воспроизведение btn, из другой позиции меняется на pause (но музыка не запускается), когда я нажимаю на нужную позицию.я думаю, что что-то не так в currentPosition!=position

Richard MacCutchan

Это звучит так, как будто вы получаете доступ к неправильному элементу при нажатии кнопки. Вам нужно выполнить некоторую отладку, чтобы найти фактические значения, которые используются для доступа к элементам.

Member 13772817

@Richard thise это мой logcat.it ничего особенного не говорит
Реконструировать ветку : ничего
04-11 20:48:13.308 12675-12675/com.example.android.musicapp D/MediaPlayer: ANDROID_HTC_INVOKE_GET_CALLING_PROCESS packageName: com.example.android.musicapp
04-11 20:48:13.318 12675-12675/com.example.android.musicapp D/MediaPlayer: setSubtitleAnchor в MediaPlayer
04-11 20:48:13.368 12675-12675/ком.пример.андроид.musicapp Д/медиаплеер: в настоящее время разгрузка: правда
04-11 20:48:22.158 12675-12675/com.example.android.musicapp I/MediaPlayer: reset() in
04-11 20:48:22.288 12675-12675/com.example.android.musicapp I/MediaPlayer: reset() out
04-11 20:48:22.298 12675-12675/com.example.android.musicapp I/MediaPlayer: release() in
выпуска() из
04-11 20:48:22.298 12675-12675/com.example.android.musicapp D/MediaPlayer: ANDROID_HTC_INVOKE_GET_CALLING_PROCESS packageName: com.example.android.musicapp
04-11 20:48:22.308 12675-12675/com.example.android.musicapp D/MediaPlayer: setSubtitleAnchor в MediaPlayer
04-11 20:48:22.338 12675-12675/ком.пример.андроид.musicapp Д/медиаплеер: в настоящее время разгрузка: правда
04-11 20:48:27.778 12675-12675/com.example.android.musicapp I/MediaPlayer: reset() in
04-11 20:48:27.798 12675-12675/com.example.android.musicapp I/MediaPlayer: reset() out
release() in
выпуска() из
04-11 20:48:27.798 12675-12675/com.example.android.musicapp D/MediaPlayer: ANDROID_HTC_INVOKE_GET_CALLING_PROCESS packageName: com.example.android.musicapp
04-11 20:48:27.818 12675-12675/com.example.android.musicapp D/MediaPlayer: setSubtitleAnchor в MediaPlayer
04-11 20:48:27.858 12675-12675/ком.пример.андроид.musicapp Д/медиаплеер: в настоящее время разгрузка: правда
04-11 20:48:33.868 12675-12675/com.example.android.musicapp I/MediaPlayer: reset() in
04-11 20:48:34.008 12675-12675/com.example.android.musicapp I/MediaPlayer: reset() out
release() in
выпуска() из
04-11 20:48:34.008 12675-12675/com.example.android.musicapp D/MediaPlayer: ANDROID_HTC_INVOKE_GET_CALLING_PROCESS packageName: com.example.android.musicapp
04-11 20:48:34.028 12675-12675/com.example.android.musicapp D/MediaPlayer: setSubtitleAnchor в MediaPlayer
04-11 20:48:34.058 12675-12675/ком.пример.андроид.musicapp Д/медиаплеер: в настоящее время разгрузка: правда
04-11 20:48:37.138 12675-12675/com.example.android.musicapp I/MediaPlayer: reset() in
04-11 20:48:37.268 12675-12675/com.example.android.musicapp I/MediaPlayer: reset() out
release() in
выпуска() из
04-11 20:48:37.268 12675-12675/com.example.android.musicapp D/MediaPlayer: ANDROID_HTC_INVOKE_GET_CALLING_PROCESS packageName: com.example.android.musicapp
04-11 20:48:37.288 12675-12675/com.example.android.musicapp D/MediaPlayer: setSubtitleAnchor в MediaPlayer
04-11 20:48:37.318 12675-12675/ком.пример.андроид.musicapp Д/медиаплеер: в настоящее время разгрузка: правда
04-11 20:48:38.788 12675-12675/com.example.android.musicapp I/MediaPlayer: release() in
04-11 20:48:38.918 12675-12675/com.example.android.musicapp I/MediaPlayer: release() out
04-11 20:48:38.918 12675-12675/com.example.android.musicapp W/MediaPlayer: mediaplayer ушел с необработанными событиями

Richard MacCutchan

Извините, но это ничего не значит. Вам нужно посмотреть на свой фактический код и, возможно, даже один шаг через него, чтобы выяснить, где возникает проблема. Следовали ли вы предложенным путям, как описано в разделе Активность | Разработчики Android[^]?