App force关闭播放音频android

App force关闭播放音频android,android,audio,Android,Audio,我有播放两个音频的代码,一个是列表中的随机音频,另一个是点击按钮设置的。但每当我按下按钮,它就会随机强制关闭。请告诉我这个问题的解决方法。谢谢 package com.example.btn; import java.net.SocketException; import java.util.Random; import android.app.Activity; import android.app.AlertDialog; impo

我有播放两个音频的代码,一个是列表中的随机音频,另一个是点击按钮设置的。但每当我按下按钮,它就会随机强制关闭。请告诉我这个问题的解决方法。谢谢

        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

创建mp11后,立即启动它。因此它将立即开始播放,这与播放mp1的瞬间几乎相同。如果希望延迟,请在runnable中触发它

附加:

查看由以下原因引起的logcat行
:java.lang.ArrayIndexOutOfBoundsException:length=5;索引=6

您已将sounds[]设置为5项,但您生成的是一个介于0和7之间的随机数,因此您的结果是数组边界之外的数字。您应该将随机数生成更改为0到4之间。更灵活的方法是使用数组的长度:

Random r = new Random();
int index = r.nextInt(sounds.length - 1);
1-2分钟后,玩了一下按钮,我发现已经没有了 声音来了。你能告诉我怎么解决这个问题吗

你对我的第一个答案的评论(顺便说一句,我肯定它回答了你的前两个问题),现在实际上是在问一个全新的问题。这就是为什么我要用一个新的答案来回答这个新问题

首先,媒体播放器占用系统资源。创建一个完整的负载通常是一个坏主意。尤其是当你用完它们后不清理时(请参阅)。您描述的问题是,在使用应用程序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();

}

顺便说一下,如果这是一个游戏或音板,你的声音是一个短片段的集合,你可能想考虑使用MealApple。在谷歌上快速搜索“android SoundPool教程”会发现大量的tut,比如。

你是说你在写一个随机播放列表吗?旁注:您的变量名是如此毫无意义(
R.raw.a,R.raw.b,R.raw.c,R.raw.d,R.raw.e
R.raw.z
mp1
mp11
btn2
)如果
(view==view)
,请删除。每次单击按钮时,它都会创建一个新的
MediaPlayer
实例。您应该尝试只使用一个,以避免过多的内存消耗。当应用程序关闭时,您会遇到哪些异常?您能提供LogCat输出吗?将mp1移动到您的runnable中回答了您的第一个问题。“附加”解决了第二个问题的ArrayIndexOutofBoundsSeption。将解决问题的答案标记为“已接受”是一种良好的礼貌。你也可以投票选出多个“有帮助”的答案。顺便说一句,你自己也会因为接受答案而得到几分。我已经将我的问题作为一个新问题发布在这里,每次你创建MediaPlayer时,你还需要注意在完成后发布它。如果每次发布新的runnable时都要创建一个新的MediaPlayer,那么还应该注意发布这些。然而,您将遇到的一个问题是,当runnable完成时,您将很快失去对每个MediaPlayer实例的引用,并且您在runnable中设置的任何侦听器都将丢失。您可以做的是将所有用于初始化、启动和释放MediaPlayer的代码放入MainActivity中的公共方法中,并从runnable调用它。我的代码有问题,请邀请我聊天。您可以邀请我聊天吗?