2014-09-01 148 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