Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使媒体播放器在按设备后退按钮从片段返回活动时停止_Java_Android - Fatal编程技术网

Java 如何使媒体播放器在按设备后退按钮从片段返回活动时停止

Java 如何使媒体播放器在按设备后退按钮从片段返回活动时停止,java,android,Java,Android,我的问题是,当我按下设备后退按钮时,媒体播放器一直在播放。当按下设备后退按钮时,如何完全销毁碎片、媒体播放器和其中的所有内容,使其在屏幕上不可见 我是编程新手,所以欢迎所有关于如何改进代码的建议和评论。多谢各位 活动: import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.FragmentManager; import android.os.Bundle; import android.view

我的问题是,当我按下设备后退按钮时,媒体播放器一直在播放。当按下设备后退按钮时,如何完全销毁碎片、媒体播放器和其中的所有内容,使其在屏幕上不可见

我是编程新手,所以欢迎所有关于如何改进代码的建议和评论。多谢各位

活动:

import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    Button button1;
    Button button2;
    Button button3;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        button1 = findViewById(R.id.button1);
        button2 = findViewById(R.id.button2);
        button3 = findViewById(R.id.button3);

        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                FragmentManager fm= getSupportFragmentManager();
                fragment1 fragment = new fragment1();
                fm.beginTransaction()
                        .replace(R.id.container,fragment)
                        .addToBackStack(null)
                        .commit();
            }
        });

        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                FragmentManager fm= getSupportFragmentManager();
                fragment2 fragment= new fragment2();
                fm.beginTransaction()
                        .replace(R.id.container,fragment)
                        .addToBackStack(null)
                        .commit();
            }
        });

        button3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                FragmentManager fm= getSupportFragmentManager();
                fragment3 fragment= new fragment3();
                fm.beginTransaction()
                        .replace(R.id.container,fragment)
                        .addToBackStack(null)
                        .commit();
            }
        });
    }
}
片段:

import androidx.fragment.app.Fragment;
import android.media.MediaPlayer;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.widget.Button;
import android.os.Bundle;
import android.widget.SeekBar;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.TextView;
import java.io.IOException;

public class fragment1 extends Fragment {

    MediaPlayer mp;
    Button play;
    SeekBar seekBar;
    TextView elapsedTimeLabel;
    TextView remainingTimeLabel;
    int totalTime;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.fragment_fragment1, container, false);

        final MediaPlayer mp = new MediaPlayer();
        try {
            mp.setDataSource("https://firebasestorage.googleapis.com...");
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            mp.prepare();
        } catch (IOException e) {
            e.printStackTrace();
        }

        final Button play = rootView.findViewById(R.id.play);
        elapsedTimeLabel = rootView.findViewById(R.id.elapsedTimeLabel);
        remainingTimeLabel = rootView.findViewById(R.id.remainingTimeLabel);
        totalTime = mp.getDuration();
        mp.seekTo(0);
        seekBar = rootView.findViewById(R.id.seekBar);
        seekBar.setMax(totalTime);
        seekBar.setOnSeekBarChangeListener

                (new SeekBar.OnSeekBarChangeListener() {
                     @Override
                     public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                         if (fromUser) {
                             mp.seekTo(progress);
                             seekBar.setProgress(progress);
                         }
                     }
                     @Override
                     public void onStartTrackingTouch(SeekBar seekBar) {
                     }
                     @Override
                     public void onStopTrackingTouch(SeekBar seekBar) {
                     }
                 }
                );

        new Thread(new Runnable() {
            @Override
            public void run() {
                while (mp != null) {
                    try {
                        Message msg = new Message();
                        msg.what = mp.getCurrentPosition();
                        handler.sendMessage(msg);
                        Thread.sleep(1000);
                    } catch (InterruptedException ignored) {
                    }
                }
            }
        }).start();

        mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

            public void onCompletion(MediaPlayer sound) {

                play.setBackgroundResource(R.drawable.play);
            }
        });

        play.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (mp.isPlaying()) {
                    mp.pause();
                    play.setBackgroundResource(R.drawable.play);

                } else {

                    mp.start();
                    play.setBackgroundResource(R.drawable.pause);
                }

            }

        });

        return rootView;
    }

    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            int currentPosition = msg.what;
            seekBar.setProgress(currentPosition);

            String elapsedTime = createTimeLabel(currentPosition);
            elapsedTimeLabel.setText(elapsedTime);

            String remainingTime;
            remainingTime = createTimeLabel(totalTime - currentPosition);
            remainingTimeLabel.setText("-" + remainingTime);
        }
    };

    public String createTimeLabel(int time) {
        String timelabel;
        int min = time / 1000 / 60;
        int sec = time / 1000 % 60;

        timelabel = min + ":";
        if (sec < 10) timelabel += "0";
        timelabel += sec;
        return timelabel;

    }


    public void play(View view) {
        if (mp == null) {
            mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {
                    stopPlayer();
                }
            });
        }

        mp.start();
    }

    public void pause(View view) {
        if (mp != null) {
            mp.pause();
        }
    }

    private void stopPlayer() {
        if (mp != null) {
            mp.release();
            mp = null;

        }
    }
}
导入androidx.fragment.app.fragment;
导入android.media.MediaPlayer;
导入android.view.LayoutInflater;
导入android.view.ViewGroup;
导入android.widget.Button;
导入android.os.Bundle;
导入android.widget.SeekBar;
导入android.os.Handler;
导入android.os.Message;
导入android.view.view;
导入android.widget.TextView;
导入java.io.IOException;
公共类fragment1扩展了Fragment{
MediaPlayer mp;
按钮播放;
SeekBar-SeekBar;
TextView elapsedTimeLabel;
文本视图保留时间标签;
整数总时间;
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
视图根视图=充气机。充气(R.layout.fragment\u fragment1,容器,false);
最终MediaPlayer mp=新MediaPlayer();
试一试{
mp.setDataSource(“https://firebasestorage.googleapis.com...");
}捕获(IOE异常){
e、 printStackTrace();
}
试一试{
mp.prepare();
}捕获(IOE异常){
e、 printStackTrace();
}
最终按钮播放=rootView.findviewbyd(R.id.play);
elapsedtimelab=rootView.findviewbyd(R.id.elapsedtimelab);
remainingTimeLabel=rootView.findviewbyd(R.id.remainingTimeLabel);
totalTime=mp.getDuration();
希克托议员(0);
seekBar=rootView.findviewbyd(R.id.seekBar);
seekBar.setMax(总时间);
seekBar.setonseekbarchaneglistener
(新SeekBar.onseekbarchaneglistener(){
@凌驾
public void onProgressChanged(SeekBar-SeekBar、int-progress、boolean-fromUser){
如果(来自用户){
希克托议员(进步党);
seekBar.setProgress(进度);
}
}
@凌驾
开始跟踪触摸时的公共无效(SeekBar SeekBar){
}
@凌驾
TopTrackingTouch(SeekBar SeekBar)上的公共无效{
}
}
);
新线程(newrunnable()){
@凌驾
公开募捐{
while(mp!=null){
试一试{
Message msg=新消息();
msg.what=mp.getCurrentPosition();
handler.sendMessage(msg);
睡眠(1000);
}捕获(InterruptedException被忽略){
}
}
}
}).start();
mp.setOnCompletionListener(新的MediaPlayer.OnCompletionListener(){
公共空间完成(MediaPlayer声音){
play.setBackgroundResource(R.drawable.play);
}
});
play.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
if(mp.isPlaying()){
mp.pause();
play.setBackgroundResource(R.drawable.play);
}否则{
mp.start();
play.setBackgroundResource(R.drawable.pause);
}
}
});
返回rootView;
}
私有处理程序=新处理程序(){
@凌驾
公共无效handleMessage(消息消息消息){
int currentPosition=msg.what;
seekBar.setProgress(当前位置);
字符串elapsedTime=createTimeLabel(当前位置);
elapsedtimelab.setText(elapsedTime);
字符串剩余时间;
remainingTime=createTimeLabel(总时间-当前位置);
remainingTimeLabel.setText(“-”+remainingTime);
}
};
公共字符串createTimeLabel(整数时间){
字符串时间标签;
int min=时间/1000/60;
整数秒=时间/1000%60;
timelabel=min+“:”;
如果(秒<10)时间标签+=“0”;
时间标签+=秒;
返回时间标签;
}
公共无效播放(视图){
if(mp==null){
mp.setOnCompletionListener(新的MediaPlayer.OnCompletionListener(){
@凌驾
完成时的公共作废(MediaPlayer mp){
停止层();
}
});
}
mp.start();
}
公共无效暂停(视图){
如果(mp!=null){
mp.pause();
}
}
私有层(){
如果(mp!=null){
mp.release();
mp=null;
}
}
}
编辑:


我尝试了提供的解决方案,但不知何故,片段中的mediaplayer没有被破坏。当我回到片段时,其中的seekbar被重置,但音频文件仍在播放。当我再次按play键时,它会在前一个键的基础上再次开始播放,因此有两个文件同时播放

不幸的是,由于片段没有
onBackPressed()
方法,因此您必须进行回调并在片段中实现它才能使其正常工作

首先,您需要创建一个实现其接口的接口和类,以拥有一个泛型方法

  • 在BackpressedListener上创建类接口
  • OnBackPressedListener.java

    公共接口
    
    @Override
    public void onDestroy() {
        super.onDestroy();
        stopPlayer();
    }
    
    @Override
    public void onDestroy() {
        stopPlayer();
        super.onDestroy();
    }