Android 声音不';当用户按back键时不会停止
我是android编程的新手。我有以下关于mediaplayer的代码。当用户按下后退键或转到其他活动时,声音不会停止 有什么问题吗?我有onDestory方法,但我的问题存在Android 声音不';当用户按back键时不会停止,android,audio,playback,Android,Audio,Playback,我是android编程的新手。我有以下关于mediaplayer的代码。当用户按下后退键或转到其他活动时,声音不会停止 有什么问题吗?我有onDestory方法,但我的问题存在 public class Elementary1Activity extends Activity implements Runnable, OnClickListener, OnSeekBarChangeListener{ private SeekBar seekBar; pri
public class Elementary1Activity extends Activity implements Runnable, OnClickListener, OnSeekBarChangeListener{
private SeekBar seekBar;
private ImageButton startMedia;
private ImageButton pauseMedia;
private MediaPlayer mp;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.elementary1);
AudioControl();
}
public void AudioControl(){
seekBar = (SeekBar) findViewById(R.id.seekBarnew2);
startMedia = (ImageButton) findViewById(R.id.playbuttonnew2);
pauseMedia = (ImageButton) findViewById(R.id.pausebuttonnew2);
seekBar.setOnSeekBarChangeListener(this);
startMedia.setOnClickListener(this);
pauseMedia.setOnClickListener(this);
}
public void run() {
int currentPosition= 0;
int total = mp.getDuration();
while (mp!=null && currentPosition<total) {
try {
Thread.sleep(1000);
currentPosition= mp.getCurrentPosition();
} catch (InterruptedException e) {
return;
} catch (Exception e) {
return;
}
seekBar.setProgress(currentPosition);
}
}
public void onClick(View v) {
pauseMedia.setVisibility(View.VISIBLE);
seekBar.setVisibility(View.VISIBLE);
startMedia.setVisibility(View.INVISIBLE);
if (v.equals(startMedia)) {
if (mp != null && mp.isPlaying()) return;
if(seekBar.getProgress() > 0) {
mp.start();
return;
}
mp = MediaPlayer.create(Elementary1Activity.this, R.raw.e1);
mp.start();
seekBar.setProgress(0);
seekBar.setMax(mp.getDuration());
new Thread(this).start();
}
if (v.equals(pauseMedia) && mp!=null) {
mp.pause();
pauseMedia.setVisibility(View.INVISIBLE);
startMedia.setVisibility(View.VISIBLE);
}
}
@Override
public void onDestroy() {
super.onStop();
mp= MediaPlayer.create(Elementary1Activity.this,R.raw.e1);
if(mp.isPlaying())
{
mp.stop();
mp.release();
finish();
}
}
public void onStartTrackingTouch(SeekBar seekBar) {
}
public void onStopTrackingTouch(SeekBar seekBar) {
}
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
if(fromUser) mp.seekTo(progress);
}
}
public class Elementary1Activity扩展活动实现可运行、OnClickListener、OnSeekBarChangeListener{
私人SeekBar SeekBar;
私有图像按钮开始媒体;
私人影像媒体;
私人媒体播放器;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.elementary1);
音频控制();
}
公共音频控制(){
seekBar=(seekBar)findViewById(R.id.seekBarnew2);
startMedia=(ImageButton)findViewById(R.id.playbuttonnew2);
pauseMedia=(图像按钮)findViewById(R.id.pausebuttonnew2);
seekBar.setonseekbarchaneglistener(这个);
startMedia.setOnClickListener(此);
pauseMedia.setOnClickListener(此);
}
公开募捐{
int currentPosition=0;
int total=mp.getDuration();
while(mp!=null&¤tPosition 0){
mp.start();
返回;
}
mp=MediaPlayer.create(Elementary1Activity.this,R.raw.e1);
mp.start();
seekBar.setProgress(0);
seekBar.setMax(mp.getDuration());
新线程(this.start();
}
如果(v.equals(pauseMedia)&&mp!=null){
mp.pause();
pauseMedia.setVisibility(视图不可见);
startMedia.setVisibility(View.VISIBLE);
}
}
@凌驾
公共空间{
super.onStop();
mp=MediaPlayer.create(Elementary1Activity.this,R.raw.e1);
if(mp.isPlaying())
{
mp.stop();
mp.release();
完成();
}
}
开始跟踪触摸时的公共无效(SeekBar SeekBar){
}
TopTrackingTouch(SeekBar SeekBar)上的公共无效{
}
更改了公共进程无效(SeekBar SeekBar,int progress,
布尔值(用户){
如果(来自用户)mp.seekTo(进度);
}
}
我会在您的Elementary1活动中使用onPause()事件来管理音乐暂停
比如:
@Override
public void onPause() {
super.onPause();
if (mp!=null) {
mp.pause();
}
}
你可以做两件事。如果您想让MediaPlayer在按下后退按钮时停止并关闭应用程序,最好的选择是:
@Override
public void onDestroy(){
if(mp != null){
if(mp.isPlaying()){
mp.stop
}
mp.release();
}
super.onDestroy();
}
如果您想在更改活动时停止MediaPlayer:
@Override
public void onPause(){
if (mp != null && mp.isPlaying()){
mp.pause();
}
}
除此之外,当您想关闭应用程序时,不要创建新的MediaPlayer。为什么要在onDestroy()中创建新的MediaPlayer?我该怎么办?请帮帮我。我是新手,我遇到了这个问题。当进程本身被销毁时调用Destroy()——通过切换进程,您只是暂停了活动。另外,在destroy()函数中创建一个新的MediaPlayer对象也没有意义,因为它将被删除
mp
在该点已经创建或未创建,因此检查它是否存在,如果存在,则暂停它,如Andreaoid的回答所示。