2015-09-15 27 views
0

我已經設置MediaPlayer播放不同的歌曲。但是,當我嘗試關閉應用程序時,活動會關閉,但歌曲仍在後臺運行。這是我編碼的方式!即使完成活動,也無法停止MusicPlayer。

try { 
     mp.setDataSource(text); 
     mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
      public void onPrepared(MediaPlayer mp) { 
       mp.start(); 
      } 
     }); 

     mp.prepare(); 
     mp.setVolume(0.4f, 0.4f); 

     songPlayer.setDataSource(song); 
     songPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
      public void onPrepared(MediaPlayer songPlayer) { 
       songPlayer.start(); 
      } 
     }); 

     songPlayer.prepare(); 
     songPlayer.setLooping(true); 

     voicePlayer.setDataSource(voice); 

     voicePlayer.setLooping(true); 
     voicePlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
      public void onPrepared(MediaPlayer voicePlayer) { 
       voicePlayer.start(); 
      } 
     }); 
     voicePlayer.prepare(); 
     voicePlayer.setVolume(0.5f,0.5f); 

    } 
    catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (SecurityException e) { 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    catch (IllegalMonitorStateException e) 
    { 
     e.printStackTrace(); 
    } 

    //THIS IS WHERE I THINK THE ERROR IS : 
    //WHERE `mp` IS LOOPED WITH DELAY OF 5000ms 
    try { 
     final Handler hlr = new Handler(); 

     final Runnable looper = new Runnable() { 
      @Override 
      public void run() { 

       if (mp != null) { 

        if (mp.isPlaying()) { 
         mp.stop(); 
        } 

       } 


       mp.start(); 

      } 
     }; 


     mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
      public void onCompletion(MediaPlayer mp) { 
       hlr.postDelayed(looper, 5000); 
      } 
     }); 

    } 
    catch(IllegalStateException e) 
    { 
     e.printStackTrace(); 

    } 



    } 


} 

還有一種方法可以在指定時間後重新開始活動。並且該活動的代碼爲:

public void snoozeup(View view) 
{ 
    SharedPreferences sa = getSharedPreferences("SnoozeList", Context.MODE_PRIVATE); 
    int snox = sa.getInt("SnoozeX",0); 

    if(snox==2) { 

     Handler handler = new Handler(); 
     Runnable x = new Runnable() { 
      @Override 
      public void run() 
      { 
       Intent intent = new Intent(Time_Date.this, Time_Date.class); 
       intent.putExtra("finisher", state); 

       startActivity(intent); 

      } 
     }; 
     handler.postDelayed(x, 120000); 

    } 


    else 
    { 
     Handler handler = new Handler(); 
     Runnable x = new Runnable() { 
      @Override 
      public void run() { 
       startActivity(new Intent(Time_Date.this, Time_Date.class)); 
      } 
     }; 
     handler.postDelayed(x, 180000); 

    } 

    try 
    { 
     if (mp != null && mp.isPlaying()) 
     { 
      Log.d("TAG------->", "mp is running"); 
      mp.stop(); 
      Log.d("TAG------->", "mp is stopped"); 
      mp.reset(); 
      mp.release(); 
      Log.d("TAG------->", "mp is released"); 
      mp=null; 
     } 

     if (voicePlayer != null && voicePlayer.isPlaying()) { 
      Log.d("TAG------->", "voiceplayer is running"); 
      voicePlayer.stop(); 
      Log.d("TAG------->", "voiceplayer is stopped"); 
      voicePlayer.release(); 
      Log.d("TAG------->", "voiceplayer is released"); 
     } 


     if (songPlayer != null && songPlayer.isPlaying()) { 
      Log.d("TAG------->", "songplayer is running"); 
      songPlayer.stop(); 
      Log.d("TAG------->", "songplayer is stopped"); 
      songPlayer.release(); 
      Log.d("TAG------->", "songplayer is released"); 
     } 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 


    finish(); 
} 

問題出在mp。 MediaPlayer的其他實例被停止。但不是mp。可悲的是,在logcat中也看不到任何錯誤。那麼我在哪裏做錯了?任何幫助將不勝感激。

+0

你在哪裏處理暫停/停止的活動? –

+0

我不處理它,我應該這樣做嗎?以下是我的完整活動代碼:https://etherpad.mozilla.org/VEh8bsOCZO。作爲初學者,我無法解決這個問題。如果你能解釋必須做什麼,這將是沒什麼太大的幫助:) – OBX

+0

是的,你停止的onResume()例如球員,所以當活動被暫停 –

回答

0

放在任何onPause()onDestroy()例子:

@Override 
protected void onPause() { 
    super.onPause(); 
    mp.stop(); 
} 
1

你毀了自己的活動,但你需要停止/太摧毀你的媒體播放器。請在你的活動中寫下以下代碼。

@Override 
    public void onDestroy() { 
     super.onDestroy(); 
     if (mp!= null) { 
     //destory ur object here. 
     } 
    } 
+0

您可能需要閱讀[我怎樣寫一個很好的答案(http://stackoverflow.com/help/how-to-answer)。只是解釋如何做事真的不會幫助任何人明白出了什麼問題。 –

+0

感謝您的建議。將在未來保重! –

+0

編輯你的答案*現在*;) –

1

爲了停止音樂,您應該將此代碼放在onPause()方法中。

這種方法可以從你的類被overrided從Activity

@Override 
protected void onPause() { 
    super.onPause(); 
    mp.stop 
} 

inherite您還可以看看Managing the Activity Lifecycle以更好地瞭解活動是由Android的管理。

+0

無法暫停活動{zyia.alarm.zyia.zyia/zyia.alarm.zyia.zyia.Time_Date}:java.lang.IllegalStateException:沒有活動 at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3260) – OBX

+0

@oblivion這是怎麼發生的?在你的主要活動?或者別的地方 ?我搜索了你的錯誤,它導致我這個 - > [無法暫停在android中的活動異常](http://stackoverflow.com/a/21182257/3612559) – WannaGetHigh

相關問題