2014-09-01 78 views
0

我有播放兩個音頻的代碼,一個是來自列表的隨機音頻,另一個是在按鈕單擊時設置的。但是每當我按下按鈕時,它都會隨機關閉。請告訴我這個問題的解決方案。謝謝!App force關閉播放音頻android

 package com.example.btn; 

    import java.net.SocketException; 
    import java.util.Random; 

    import android.app.Activity; 
    import android.app.AlertDialog; 
    import android.media.MediaPlayer; 
    import android.os.Bundle; 
    import android.os.Handler; 
    import android.view.View; 

     public class MainActivity extends Activity { 
      Handler mHandler; // global instance 
      Runnable your_runnable; // global instance 

      @Override 
      protected void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       setContentView(R.layout.activity_main); 
      } 

      public void yolo(final View view) { 

       if (view == view) { 
        view.setBackgroundResource(R.drawable.btn1);// Change to this when 
                   // clicked 
        final MediaPlayer mp11 = MediaPlayer.create(getBaseContext(),R.raw.animals009);// get mp3 dir 
        mp11.start(); // play mp3 
        mHandler = new Handler(); 
        your_runnable = new Runnable() { 

         @Override 
         public void run() { 
          view.setBackgroundResource(R.drawable.btn2);// Revert back 
                     // to this after 
                     // timer 
          int[] sounds={R.raw.animals010, R.raw.animals012, R.raw.animals013,R.raw.animals019,R.raw.animals114}; 
          Random r = new Random(); 
          int Low = 0; 
          int High = 7; 
          int rndm = r.nextInt(High-Low) + Low; 
          MediaPlayer mp1 = MediaPlayer.create(getApplicationContext(),sounds[rndm]); 
          mp1.start(); 




         } 

        }; 

        mHandler.postDelayed(your_runnable, 3000L);// 3sec timer 

       } 


      } 
     } 

日誌貓

09-01 07:38:41.673: V/MediaPlayer(16923): isPlaying: 1 
09-01 07:38:41.673: V/MediaPlayer-JNI(16923): isPlaying: 1 
09-01 07:38:42.658: D/AndroidRuntime(16923): Shutting down VM 
09-01 07:38:42.658: W/dalvikvm(16923): threadid=1: thread exiting with uncaught  exception (group=0x4170fc08) 
09-01 07:38:42.663: E/AndroidRuntime(16923): FATAL EXCEPTION: main 
09-01 07:38:42.663: E/AndroidRuntime(16923): Process: com.example.btn, PID: 16923 
09-01 07:38:42.663: E/AndroidRuntime(16923): java.lang.IllegalStateException: Could not execute method of the activity 
09-01 07:38:42.663: E/AndroidRuntime(16923): at android.view.View$1.onClick(View.java:3969) 
09-01 07:38:42.663: E/AndroidRuntime(16923): at android.view.View.performClick(View.java:4630) 
09-01 07:38:42.663: E/AndroidRuntime(16923): at  android.view.View$PerformClick.run(View.java:19339) 
09-01 07:38:42.663: E/AndroidRuntime(16923): at  android.os.Handler.handleCallback(Handler.java:733) 
09-01 07:38:42.663: E/AndroidRuntime(16923): at android.os.Handler.dispatchMessage(Handler.java:95) 
09-01 07:38:42.663: E/AndroidRuntime(16923): at android.os.Looper.loop(Looper.java:157) 
09-01 07:38:42.663: E/AndroidRuntime(16923): at android.app.ActivityThread.main(ActivityThread.java:5335) 
09-01 07:38:42.663: E/AndroidRuntime(16923): at java.lang.reflect.Method.invokeNative(Native Method) 
09-01 07:38:42.663: E/AndroidRuntime(16923): at java.lang.reflect.Method.invoke(Method.java:515) 
09-01 07:38:42.663: E/AndroidRuntime(16923): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265) 
09-01 07:38:42.663: E/AndroidRuntime(16923): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081) 
09-01 07:38:42.663: E/AndroidRuntime(16923): at dalvik.system.NativeStart.main(Native Method) 
09-01 07:38:42.663: E/AndroidRuntime(16923): Caused by: java.lang.reflect.InvocationTargetException 
09-01 07:38:42.663: E/AndroidRuntime(16923): at java.lang.reflect.Method.invokeNative(Native Method) 
09-01 07:38:42.663: E/AndroidRuntime(16923): at java.lang.reflect.Method.invoke(Method.java:515) 
09-01 07:38:42.663: E/AndroidRuntime(16923): at android.view.View$1.onClick(View.java:3964) 
09-01 07:38:42.663: E/AndroidRuntime(16923): ... 11 more 
09-01 07:38:42.663: E/AndroidRuntime(16923): Caused by: java.lang.ArrayIndexOutOfBoundsException: length=5; index=6 
09-01 07:38:42.663: E/AndroidRuntime(16923): at com.example.btn.MainActivity.yolo(MainActivity.java:28) 
09-01 07:38:42.663: E/AndroidRuntime(16923): ... 14 more 
09-01 07:38:43.783: V/MediaPlayer(16923): message received msg=2, ext1=0, ext2=0 
09-01 07:38:43.783: V/MediaPlayer(16923): playback complete 
+0

你的意思是你正在寫一個隨機播放列表? *旁註:*你的變量名是如此無意義('R.raw.a,R.raw.b,R.raw.c,R.raw.d,R.raw.e','R.raw.z' ,'mp1','mp11','btn2') – Raptor 2014-09-01 01:55:34

+1

如果'(查看==查看)',則刪除。 每次單擊該按鈕時,它都會創建一個新的「MediaPlayer」實例。您應該嘗試使用一個以避免過多的內存消耗。當應用程序關閉時,你會得到什麼異常?你能提供LogCat輸出嗎? – 2014-09-01 01:59:08

+0

檢查logcat ... – 2014-09-01 02:15:38

回答

1

你開始mp11創建後立即。所以它會立即開始播放,這幾乎是相同的即時mp1正在播放。如果您希望延遲,請在可運行的代碼中觸發它。

Additinal:

看到logcat的線Caused by: java.lang.ArrayIndexOutOfBoundsException: length=5; index=6

您已經設置了您的聲音[]與5個項目,但你產生0和7之間的隨機數,所以你結束了數組邊界外的數字。您應該將隨機數生成更改爲0 4之間以及更靈活的方法是使用數組的長度:

Random r = new Random(); 
int index = r.nextInt(sounds.length - 1); 
+0

將mp1移入您的runnable回答了您的第一個問題。 「附加」解決了第二個問題的ArrayIndexOutOfBoundsExeption。標記將您的問題解決爲「已接受」的答案是很好的舉止。您也可以爲「有幫助」提供多種答案。順便說一下,您還可以自己接受幾點以接受答案。 – 2014-09-02 00:08:19

+0

我已經發布我的問題作爲一個新的問題在這裏http://stackoverflow.com/questions/25629894/no-sound-in-soundpool-android – 2014-09-05 05:09:36

1

1-2分鐘後,用按鈕玩,我發現有沒有更多 聲音來了。你能告訴我如何解決這個問題嗎?

您對我的第一個答案(我很肯定地回答你的前兩個問題)的評論,現在實際上是在問一個全新的問題。這就是爲什麼我在新答案中對這個新問題的迴應。

首先,MediaPlayers佔用系統資源。創建它們的整個負載通常是一個壞主意。特別是如果在完成後不清理(請參閱Releasing the MediaPlayer)。您所描述的問題,即在使用您的應用程序1-2分鐘後聲音停止播放的情況,通常是耗盡系統資源。

下面是使用MediaPlayer的更高資源安全模式:

MediaPlayer mediaPlayer; 
... 
public void btnOnClick(View view) { 

    // Setup the MediaPlayer with a resource 
    mediaPlayer = MediaPlayer.create(getContext(), R.raw.sound); 

    // Set a callback to listen for when the sound finishes playing 
    mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 

     @Override 
     public void onCompletion(MediaPlayer mp) { 
      // The sound has finished playing so release the resources being used by the MediaPlayer 
      mediaPlayer.release(); 
      mediaPlayer = null; 
     } 
    } 

    // Start playback 
    mediaPlayer.start(); 

} 

順便說一句,如果這是對像遊戲或音板,你的聲音是短片的集合,你可以想要考慮使用SoundPool而不是MediaPlayer。 「Android SoundPool教程」的一個快速谷歌將帶來像for example this one這樣的負載。

+0

每次你創建一個MediaPlayer時,你也需要照顧釋放它,當你'重做。如果每次發佈新的可運行代碼時都要創建新的MediaPlayer,則還應該注意釋放這些代碼。然而,您將遇到的一個問題是,當runnable完成時,您將很快失去對每個MediaPlayer實例的引用,並且您在runnable中設置的任何偵聽器都將丟失。你可以做的是將所有用於初始化,啓動和釋放MediaPlayer的代碼放入MainActivity的公共方法中,然後從可運行的對象中調用它。 – 2014-09-02 04:42:42

+0

非常好。真高興你做到了。 – 2014-09-02 08:39:26

+0

我的代碼存在一些問題,請邀請我聊天。 – 2014-09-02 13:51:22