当前位置: 首页 > 知识库问答 >
问题:

仅当MediaPlayer对象正在播放时,才需要if语句来停止该对象

俞衡虑
2023-03-14

我创建了一个计时器,这样当它结束时,音乐就会播放。但是如果用户按下后退按钮,歌曲不会停止播放。因此,我尝试覆盖生命周期方法onPause(),该方法有效,因此,如果计时器已完成且音乐正在播放,则使用“后退”按钮停止音乐。

但是,当用户试图在计时器结束之前按下设备的后退按钮(音乐尚未开始)时,我会在onPause()方法中得到一个null指针异常。

这是什么原因造成的?如何编写这样的代码:“如果MediaPlayer正在播放,那么停止并释放它,否则什么也不做”。这就是我在概念上需要的。(或者有更好的方法来写呢?)

这是我在计时器的onFinish()方法中的MediaPlayer的代码片段,当计时器完成时,它会使歌曲开始播放。(mpCise只是一个全局变量,表示mp,所以我可以在onFinish()之外使用它。)

public void onFinish() {
                mTextField.setText("BRAINS!!");
                // call some media function here
                MediaPlayer mp = MediaPlayer.create(ZombieThemedActivity.this, R.raw.zombie_sound);
                mp.start();
                mpCease = mp;

                // This disables the pause/play button when timer ends
                Button disablePausePlay = (Button)findViewById(R.id.btnPause);
                disablePausePlay.setEnabled(false);
        }

以下是目前为止编写的onPause方法(它还不完整),当按下“后退”按钮时(仅当音乐已经播放时),它可以很好地停止音乐。

@Override
    protected void onPause(){
            super.onPause();
        if (mpCease.isPlaying()) {
            mpCease.stop();
            mpCease.release();
        } else if (!mpCease.isPlaying()) {
            // it should do nothing to mpCease or to anything else
        }
    }

LogCat(当在计时器完成前按下后退按钮时,它会崩溃)。

FATAL EXCEPTION: main
    java.lang.RuntimeException: Unable to pause activity {com.azurespot.disastertimer.app/com.azurespot.disastertimer.app.themedactivities.ZombieThemedActivity}: java.lang.NullPointerException
            at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2838)
            at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2794)
            at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:2772)
            at android.app.ActivityThread.access$800(ActivityThread.java:130)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1212)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:4745)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.NullPointerException
            at com.azurespot.disastertimer.app.themedactivities.ZombieThemedActivity.onPause(ZombieThemedActivity.java:157)
            at android.app.Activity.performPause(Activity.java:5106)
            at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1225)
            at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2825)
            at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2794)
            at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:2772)
            at android.app.ActivityThread.access$800(ActivityThread.java:130)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1212)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:4745)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
            at dalvik.system.NativeStart.main(Native Method)

共有1个答案

计弘
2023-03-14

只需去掉mp,用mpstop替换即可。然后检查它是否为null

@Override
protected void onPause(){
        super.onPause();
    if (mpCease != null) //add a null check here
    {
        if (mpCease.isPlaying()) { 
            mpCease.stop();
            mpCease.release();
        // if this does nothing then the else isn't needed
        } else {
            // it should do nothing to mpCease or to anything else
        }
    }

你甚至不必去掉mp,只需检查mpstop是否为null。直到(我假设)一个倒计时onFinish(),你才初始化它。所以,如果他们在它完成之前按back,那么显然它是null

 类似资料:
  • 我创建的Android应用程序包含2个按钮,点击每个按钮播放mp3文件。问题是,当我播放按钮1时,它播放声音1,当我单击按钮2时,它播放声音2。 我检查其他玩家的每个按钮是否正常工作,然后停止并播放单击的按钮 但是,如果我两次单击同一个按钮,则会将第一个音频保持在后台播放,然后再次播放另一个音频 我试图检查并停止它,但它不起作用! 我想,如果我点击按钮1,它将播放声音,如果再次点击它,它将停止播放

  • 我正在android上开发一个音乐播放器,该应用程序有两个活动(MainActivity和PlayActivity)。在Main活动中,我有一个包含歌曲列表的列表视图,在PlayActivity中,我有一个按钮来收听和暂停音乐。问题是,当我返回MainActivity并从listview中选择一首新歌时,第一首歌会继续在后台播放,而第二首歌也会开始播放。选择新歌曲时,如何停止第一首歌曲?(我不想让

  • 我有一个ListView,里面有一些项目,每个项目都播放一定的声音。这是代码: 如果我点击一个项目,它开始播放,然后在我之前点击的项目完成播放之前点击另一个项目,MediaPlayer只会同时播放两种声音。如果我在MediaPlayer停止()播放以前的声音并开始播放新的声音,那么在它停止播放之前我已经单击了该项目? 我尝试在try之前添加player.stop(),这样每次单击一个项目时,Med

  • 我有一个按钮,我想用这个按钮控制多个MediaPlayer对象。在示例中,用户从列表中选择了3个声音,当他们正在播放时,用户点击暂停图标按钮,所有声音都应该暂停(并且暂停按钮的资源应该更改为播放图标)。如果用户再次点击播放图标,所有的声音应该继续。 如果我删除代码中的其他部分,我可以实现暂停声音,这是当前正在播放,但如果我再次单击播放按钮,声音将不会播放,什么也不会发生。 我得XML: 我的代码:

  • 当我运行它时,我得到一个x​​一段时间后的错误。我知道我犯了这个错误,因为它在这一页的末尾。如何在没有收到此错误的情况下停止程序? 我试过了 或 我的代码是: 打印(newsContents.text)属性错误:“非类型”对象没有属性“文本”

  • 我有一个函数来获取服务长度,我需要执行一个if语句来检查空日期,我是否能够使用术语if@dateleftorg=='1900-01-01 00:00:00.000'我需要做的是,如果@dateleftorg为空,则使用GETDATE(),否则我使用@dateleftorg中的值