【问题标题】:Stop media player on press of back button按下后退按钮停止媒体播放器
【发布时间】:2015-01-10 19:29:58
【问题描述】:

我有一个从 URL 播放 mp3 的媒体播放器。当我播放歌曲并按下后退按钮时,应用程序会出错。我用prepareAsync();

我是新人,如果你不能很好地理解我,很抱歉。

这是我的play 函数和ondestroy 函数。谢谢。

public void  playSong(final int naatindex){
    // Play song
    tv = (TextView) this.findViewById(R.id.mywidget);  
    try {
        mp.reset();
        mp.setDataSource(naatpaths[naatindex]);
        Log.w("Play Song", "CS"+naatindex);
        tv.setText("Buffering Please Wait....!");
        songCurrentDurationLabel.setVisibility(View.INVISIBLE);
        tv.setSelected(true);
        songTotalDurationLabel.setVisibility(View.INVISIBLE);
        mp.prepareAsync();
        mp.setOnPreparedListener(new OnPreparedListener(){
            @Override
            public void onPrepared(MediaPlayer mp){
                songCurrentDurationLabel.setVisibility(View.VISIBLE);
                songTotalDurationLabel.setVisibility(View.VISIBLE);

                    mp.start();

                    tv.setText(naattitles[naatindex]);
                    // Changing Button Image to pause image
                    btnPlay.setImageResource(R.drawable.btn_pause);
                    // set Progress bar values
                    songProgressBar.setProgress(0);
                    songProgressBar.setMax(100);
                    // Updating progress bar
                    updateProgressBar();
            }
        });



        mp.setOnErrorListener(new OnErrorListener() {
            public boolean onError(MediaPlayer mp, int what, int extra) {
                Log.w("Unable to Play", "CS"+naatindex);
                playSong(currentSongIndex+1);
                return false;
            }
        });




         // Set focus to the textview
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

  @Override
  public void onDestroy(){
  mp.release();
  mp = null;
  super.onDestroy();
  }

这是我的日志错误

01-10 16:16:40.339: W/dalvikvm(26539): threadid=1: thread exiting with uncaught exception (group=0x416282a0)
01-10 16:16:40.344: E/AndroidRuntime(26539): FATAL EXCEPTION: main
01-10 16:16:40.344: E/AndroidRuntime(26539): java.lang.NullPointerException
01-10 16:16:40.344: E/AndroidRuntime(26539):    at com.maulantariqjameel.bayyan.media_player$1.run(media_player.java:5032)
01-10 16:16:40.344: E/AndroidRuntime(26539):    at android.os.Handler.handleCallback(Handler.java:615)
01-10 16:16:40.344: E/AndroidRuntime(26539):    at android.os.Handler.dispatchMessage(Handler.java:92)
01-10 16:16:40.344: E/AndroidRuntime(26539):    at android.os.Looper.loop(Looper.java:137)
01-10 16:16:40.344: E/AndroidRuntime(26539):    at android.app.ActivityThread.main(ActivityThread.java:4921)
01-10 16:16:40.344: E/AndroidRuntime(26539):    at java.lang.reflect.Method.invokeNative(Native Method)
01-10 16:16:40.344: E/AndroidRuntime(26539):    at java.lang.reflect.Method.invoke(Method.java:511)
01-10 16:16:40.344: E/AndroidRuntime(26539):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
01-10 16:16:40.344: E/AndroidRuntime(26539):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
01-10 16:16:40.344: E/AndroidRuntime(26539):    at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

    标签: java android media-player


    【解决方案1】:
    @Override 
    protected void onDestroy() { 
    if (runnableObject != null) 
    myHandler.removeCallbacks(runnableObject ); 
    super.onDestroy(); 
    }
    private void backPressed() {
    if (mpAudioSdCard != null) {
                mpAudioSdCard.stop();
                mpAudioSdCard.release();
                mpAudioSdCard = null;
            }
    
    }
    

    试试这个它对我有用我认为你的错误是你调用 super.onDestroy();第一个

    【讨论】:

      【解决方案2】:
      private void releaseMediaPlayer() {
          if (mp!= null) {
              if(mp.isPlaying()) {
                  mp.stop();
              }
              mp.release();
              mp= null;
          }
      }
      
      @Override
      protected void onDestroy() {
          super.onDestroy();
          releaseMediaPlayer();
      }
      

      private void releaseMediaPlayer() {
          if (mp!= null) {
              if(mp.isPlaying()) {
                  mp.stop();
              }
              mp.release();
              mp= null;
          }
      }
      
      @Override
      public void onBackPressed() {
          releaseMediaPlayer();
          finish();
      }
      

      【讨论】:

      • 朋友我试试这个,但它仍然给出错误我可以给你发送日志详细信息
      【解决方案3】:

      在 onDestroy() 中没有必要调用 this.finish() 因为活动已经完成。删除该行并重试。

      【讨论】:

      • 是的朋友我删除了 this.finish() 但它仍然给出错误。在关闭应用程序
      • 如果您可以发布错误的确切堆栈跟踪,我将能够为您提供更好的帮助。
      • Zohaib 我认为应该有更多的堆栈跟踪。我认为您只发布了其中的一部分。请发布整个堆栈跟踪。
      【解决方案4】:

      你应该在发布之前调用 super.onbackpressed()..试试这个代码

      @Override
      public void onBackPressed() {
       super.onBackPressed();
      System.out.println("onBackPressed() called");
      releaseMediaPlayer();
      
      }
      

      【讨论】:

        【解决方案5】:

        查看日志,错误似乎发生在您已发布到HandlerRunnable 中。我猜你是使用 postDelayed() 定期更新 UI 或基于MediaPlayer 状态的东西发布的。我对吗?您在 onDestroy() 中将 mp 设置为 null 但 Runnable 继续运行并尝试访问它,导致 NullPointerException

        要解决此问题,您需要在 onDestroy() 中清除处理程序的待处理 Runnables 队列,如下所示:

        mHandler.removeCallbacks(null);
        

        更好的是在你的 onPause() 中执行它,然后在 onResume() 中重新启动它

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-22
          • 2023-03-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多