2011-10-02 102 views
1

我的代碼有什麼問題?我有一個切換按鈕,我想播放/停止一個MP3。我猜的代碼應該如下:在Android問題上使用MediaPlayer類播放MP3

package com.android.iFocus; 


import android.app.Activity; 
import android.media.MediaPlayer; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.ToggleButton; 

public class iFocusActivity extends Activity implements OnClickListener { 
    public int count; 
    MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.rain); 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     ToggleButton toggleRain = (ToggleButton)findViewById(R.id.toggleRain); 

     //Define Listeners 
     toggleRain.setOnClickListener(this); 

     count = 0; 


    } 


    @Override  
    public void onClick(View toggleRain) { 


     if(count==0){ 

      mediaPlayer.start(); 
      count=1; 
     } else { 
      //MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.rain); 
        mediaPlayer.pause(); 
      mediaPlayer.stop(); 
        mediaPlayer.release(); 
      count=0; 
     } 

    } 

} 

的問題是:Eclipse不給任何錯誤,但在仿真器/手機它給了我一個異常和模具立即開始後。這裏有雲:

10-02 20:28:24.312: INFO/ActivityManager(59): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.android.iFocus/.iFocusActivity } 
10-02 20:28:24.392: DEBUG/AndroidRuntime(960): Shutting down VM 
10-02 20:28:24.402: DEBUG/dalvikvm(960): Debugger has detached; object registry had 1 entries 
10-02 20:28:24.462: INFO/ActivityManager(59): Start proc com.android.iFocus for activity com.android.iFocus/.iFocusActivity: pid=967 uid=10036 gids={} 
10-02 20:28:24.502: INFO/AndroidRuntime(960): NOTE: attach of thread 'Binder Thread #3' failed 
10-02 20:28:25.822: DEBUG/AndroidRuntime(967): Shutting down VM 
10-02 20:28:25.822: WARN/dalvikvm(967): threadid=1: thread exiting with uncaught exception (group=0x4001d800) 
10-02 20:28:25.932: ERROR/AndroidRuntime(967): FATAL EXCEPTION: main 
10-02 20:28:25.932: ERROR/AndroidRuntime(967): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.android.iFocus/com.android.iFocus.iFocusActivity}: java.lang.NullPointerException 

好吧,當我初始化的onClick內部類中的MediaPlayer,它並沒有給我任何錯誤,並且aplication不給我開始這首歌的任何錯誤。但它不應該停止。所以,當我點擊toggleButton時,它會啓動,當我再次單擊時,它不會執行任何操作,但會在日誌貓上給我一個錯誤:

第一次按下切換按鈕並且歌曲開始正常時出錯錯誤):

10-02 20:39:02.712: INFO/ActivityManager(59): Start proc com.android.iFocus for activity com.android.iFocus/.iFocusActivity: pid=996 uid=10036 gids={} 
10-02 20:39:02.782: INFO/AndroidRuntime(989): NOTE: attach of thread 'Binder Thread #3' failed 
10-02 20:39:04.432: INFO/ActivityManager(59): Displayed activity com.android.iFocus/.iFocusActivity: 1804 ms (total 640049 ms) 
10-02 20:39:08.672: DEBUG/AudioSink(34): bufferCount (4) is too small and increased to 12 
10-02 20:39:08.982: WARN/AudioFlinger(34): write blocked for 73 msecs, 2105 delayed writes, thread 0xb3b8 
10-02 20:39:09.682: DEBUG/dalvikvm(437): GC_EXPLICIT freed 686 objects/38192 bytes in 216ms 
10-02 20:39:14.502: WARN/AudioFlinger(34): write blocked for 86 msecs, 2110 delayed writes, thread 0xb3b8 
10-02 20:39:14.642: DEBUG/dalvikvm(188): GC_EXPLICIT freed 164 objects/11408 bytes in 176ms 
10-02 20:39:19.622: DEBUG/dalvikvm(261): GC_EXPLICIT freed 43 objects/1912 bytes in 154ms 
10-02 20:39:20.352: WARN/AudioFlinger(34): write blocked for 78 msecs, 2119 delayed writes, thread 0xb3b8 

錯誤,當我再次按下切換按鈕和歌曲應該停止:

10-02 20:43:22.412: ERROR/MediaPlayer(1032): pause called in state 8 
10-02 20:43:22.412: ERROR/MediaPlayer(1032): error (-38, 0) 
10-02 20:43:22.412: ERROR/MediaPlayer(1032): stop called in state 0 
10-02 20:43:22.412: ERROR/MediaPlayer(1032): error (-38, 0) 
10-02 20:43:22.612: WARN/MediaPlayer(1032): mediaplayer went away with unhandled events 
10-02 20:43:22.612: WARN/MediaPlayer(1032): mediaplayer went away with unhandled events 
10-02 20:43:22.622: WARN/MediaPlayer(1032): mediaplayer went away with unhandled events 
10-02 20:43:22.622: WARN/MediaPlayer(1032): mediaplayer went away with unhandled events 

回答

4

第一件事,第一,我的分析:1。 你沒有初始化裏面的onCreate在MediaPlayer():

MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.rain); 

'這個' < ---這個東西是NULL,因此你運行時出現NullPointerException,首先加載應用程序時間。
2.在第二點擊按鈕,你叫

mediaPlayer.release(); 

而且您下一次單擊,在異常狀態的MediaPlayer

好了,解決方法是非常簡單的,你需要考慮的最佳實踐在Android上編程:

package pete.android.study; 

import android.app.Activity; 
import android.media.MediaPlayer; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.ToggleButton; 

public class Main extends Activity implements OnClickListener { 
     // declare controls 
     public int count = 0; 
     MediaPlayer mediaPlayer = null; 
     ToggleButton toggleRain = null; 
     /* 
     * (non-Javadoc) 
     * @see android.app.Activity#onCreate(android.os.Bundle) 
     */ 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      // load layout 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main); 
      // load controls 
      toggleRain = (ToggleButton)findViewById(R.id.toggleRain); 
      // init player 
      mediaPlayer = MediaPlayer.create(this, R.raw.rain); 
      // set click event handler 
      toggleRain.setOnClickListener(this); 
      // init state for playing 
      count = 0; 
     } 

     /* 
     * (non-Javadoc) 
     * @see android.view.View.OnClickListener#onClick(android.view.View) 
     */ 
     @Override  
     public void onClick(View toggleRain) { 
      if(count == 0){ 
       mediaPlayer.start(); 
       count = 1; 
      } else { 
       mediaPlayer.pause();     
       count = 0; 
      } 
     } 

     /* 
     * (non-Javadoc) 
     * @see android.app.Activity#onDestroy() 
     */ 
     @Override 
     protected void onDestroy() { 
      if(mediaPlayer != null) { 
       mediaPlayer.stop(); 
       mediaPlayer.release(); 
       mediaPlayer = null; 
      } 
     } 

} 

當然,它的作品像魅力^^! 有很多方法來改善這個簡單的應用程序,但是,我想你可以通過查看Android開發人員的參考文檔找到:)​​

+0

工作就像一個魅力!我做了一個改進,這是在保護無效onDestroy(){}添加super.onDestroy()(原因是在後面的按鈕「關閉」之前崩潰)。我會繼續改善這一點,這是我的第一個應用程序。:) – Pabluez

0

您是否嘗試過移動初始化裏面的onCreate的,而不是隻在類體內?這將是最好的地方。

如果您在onClick中進行初始化,則預期會顯示您顯示的錯誤。這是因爲每次點擊時都會創建一個新的MediaPlayer實例。

+0

是的,我做過這個,但編譯器說,無法解析onPlayer中的mediaPlayer對象()。我想我應該讓mediaPlayer成爲全球的(因爲eclipse說本地媒體播放器沒有被使用,那麼,嘗試了很多東西,比如把mediaPlayer這個詞作爲onClick的參數(但是eclipse在這個標記之後說「VariableDeclaratorId」)。 – Pabluez

0

你的問題是這裏的release()聲明:

if(count==0){ 
    mediaPlayer.start(); 
    count = 1; 
} else { 
    //MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.rain); 
    mediaPlayer.pause(); 
    mediaPlayer.stop(); 
    mediaPlayer.release(); 
    count = 0; 
} 

有你可以改變這一點,取決於你想要的結果了幾個不同的方式。如果您只想播放/暫停,如您所說,那麼您只需要刪除stop()release()來電。特別是release()。該調用會將音頻資源釋放回系統,這意味着您需要將其恢復到準備好的狀態,然後才能再次使用它。

我強烈建議閱讀this reference document非常徹底。 MediaPlayer類相當複雜,當狀態管理不當時,很容易出現這種錯誤。

相關問題