在Android中,当我播放音频并转到其他活动时,音频回来后不会停止

Posted

技术标签:

【中文标题】在Android中,当我播放音频并转到其他活动时,音频回来后不会停止【英文标题】:In Android, When I Play Audio and go to other activity, audio doesn't stop after coming back 【发布时间】:2017-06-07 15:25:45 【问题描述】:

我是 android 环境中的新手,我的问题是当我播放音频文件并转到其他活动或按返回按钮时,再次打开我播放音频的应用程序,当我按停止时它不会停止按钮。当我按下主页按钮并尝试停止时它可以工作。谁能建议我做什么 这是我的活动代码

package com.example.mudassar.myaudioapp;

import android.content.Intent;
import android.os.Environment;
import android.os.NetworkOnMainThreadException;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.media.MediaPlayer;
import android.os.Handler;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity 

    //MediaPlayer mp;
    Button playBtn, pauseBtn, stopBtn;
    SeekBar sb;
    Handler han = new Handler();
    MediaPlayer mp;// = MediaPlayer.create(MainActivity.this, R.raw.firefly);

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

        playBtn= (Button)findViewById(R.id.playBtn);
        pauseBtn= (Button)findViewById(R.id.pauseBtn);
        stopBtn=(Button) findViewById(R.id.stopBtn);




        try
            //you can change the path, here path is external directory(e.g. sdcard) /Music/maine.mp3
            //mp.setDataSource(Environment.getExternalStorageDirectory().getPath()+"/raw/.mp3");
            mp = MediaPlayer.create(MainActivity.this, R.raw.firefly);
            mp.prepare();
        catch(Exception e)e.printStackTrace();

        sb = (SeekBar)findViewById(R.id.seekBar);
        sb.setMax(mp.getDuration());

        SeekUpdation();

        playBtn.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                SeekUpdation();
                //if (mp == null)
                if(mp.isPlaying() == false)
                    mp = MediaPlayer.create(MainActivity.this, R.raw.firefly);
                mp.start();
                sb.setMax(mp.getDuration());
                sb.setProgress(mp.getCurrentPosition());
            
        );

        pauseBtn.setOnClickListener(new View.OnClickListener()
            @Override
            public void onClick(View v)
                if(mp.isPlaying() == false)
                    mp.start();
                    sb.setProgress(mp.getCurrentPosition());
                    Toast.makeText(MainActivity.this, "Playing", Toast.LENGTH_SHORT).show();
                else if(mp.isPlaying() == true)
                    mp.pause();
                    sb.setProgress(mp.getCurrentPosition());
                    Toast.makeText(MainActivity.this, "Paused", Toast.LENGTH_SHORT).show();
                

            
        );

        stopBtn.setOnClickListener(new View.OnClickListener() 

            @Override
            public void onClick(View v) 
                // TODO Auto-generated method stub
                //if (mp != null) 
                if(mp.isPlaying() == true)
                    mp.stop();
                    sb.setProgress(mp.getDuration());
                    //mp = null;
                
                Toast.makeText(MainActivity.this, "Stoped", Toast.LENGTH_SHORT).show();
            
        );

        sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener()
            @Override
            public void onStopTrackingTouch(SeekBar seekBar)
                //if(mp!=null)
                if(!mp.isPlaying())
                    mp.seekTo(seekBar.getProgress());
                    mp.start();
                
            
            @Override
            public void onStartTrackingTouch(SeekBar seekBar)
                //if(mp!=null)
                 if(mp.isPlaying())
                     mp.pause();
                 else
                     mp.start();
            

            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)

            
        );

        Button btn = (Button)findViewById(R.id.secondActivityButton);

        btn.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                startActivity(new Intent(MainActivity.this, second.class));
            
        );
    

    public void MyOwnClick(View v)
        startActivity(new Intent(MainActivity.this, second.class));
    

    public Runnable run = new Runnable() 
        @Override
        public void run() 
            SeekUpdation();
        
    ;

    public void SeekUpdation() 
        //if(mp!=null)
        if(mp.isPlaying() == true)
        
            sb.setProgress(mp.getCurrentPosition());
            han.postDelayed(run, 1000);
            //Toast.makeText(MainActivity.this, "is Playing", Toast.LENGTH_SHORT).show();
        else
            Toast.makeText(MainActivity.this, "Seek", Toast.LENGTH_SHORT).show();
        
    

【问题讨论】:

你应该把你的活动代码放在这里。 【参考方案1】:

对于快速解决方案,您可以创建如下方法:

void resetMediaPlayer() 
   if(mediaPlayer!=null) 
       try 
             mediaPlayer.reset();
       
       catch(Exception e) 
           e.printStackTrace();
       
   

然后覆盖activity 中的onBackPressed 方法并调用resetMediaPlayer

@Override
public void onBackPressed()
    super.onBackPressed();
  resetMediaPlayer()

或者在你需要停止media player的任何地方调用它。

虽然这不是停止媒体播放器的好方法。为了更好地实现,您必须像这样更改您的 resetMediaPlayer 方法:

void resetMediaPlayer() 
    if(mediaPlayer!=null) 
        try 
            mediaPlayer.reset();
            mediaPlayer.release();
        
        catch(Exception e) 
            e.printStackTrace();
        
    

每当您想启动 Media Player 时,您都必须创建一个新的媒体播放器实例,例如:

void startMediaPlayer(int selectedSong) 
    try 
        mediaPlayer = MediaPlayer.create(activity, selectedSong);
        mediaPlayer.start();
     catch (Exception e) 
        e.printStackTrace();
    

并且还在你的activityonDestroy 方法中调用resetMediaPlayer

@Override
protected void onDestroy() 
    super.onDestroy();
    resetPlayView();

【讨论】:

最好也调用resetMediaPlayer onDestroy 很高兴为您提供帮助,如果解决了您的问题,请考虑接受。

以上是关于在Android中,当我播放音频并转到其他活动时,音频回来后不会停止的主要内容,如果未能解决你的问题,请参考以下文章

当用户切换到 Android Studio Kotlin 中的其他页面时,如何停止播放音乐?

在活动中添加后退按钮

当我单击 Eclipse 中的按钮时,使用 tabHost 并转到特定选项卡

android在应用程序/活动中嵌入默认音频播放器

当我单击多个按钮时,多个音频开始在 android studio 中同时播放

即使我切换了活动,如何在活动中播放单个音频文件?