簡體   English   中英

App Force在播放音頻android時關閉

[英]App force closes on playing audio 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

創建后立即啟動mp11 因此,它將立即開始播放,這與mp1播放的瞬間幾乎相同。 如果要延遲它,請改為在您的runnable中觸發它。

附加的:

參見logcat行Caused by: java.lang.ArrayIndexOutOfBoundsException: length=5; index=6 Caused by: java.lang.ArrayIndexOutOfBoundsException: length=5; index=6

您已經將sounds []設置為5個項目,但是您正在生成一個介於0到7之間的隨機數,因此您最終得到的數字超出了數組的范圍。 您應該將生成的隨機數更改為0到4之間。更靈活的方法是使用數組的長度:

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

1-2分鍾后,使用按鈕進行播放,我發現沒有聲音了。 你能告訴我如何解決嗎?

您對我的第一個答案的評論(我可以肯定地回答了您的前兩個問題)實際上是在詢問一個全新的問題。 這就是為什么我將對這個新問題的回答放在一個新的答案中。

首先,MediaPlayers占用系統資源。 創建全部負載通常是一個壞主意。 特別是如果您在使用完它們后仍不清理(請參見釋放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。 快速谷歌為“機器人的Soundpool教程”將變成像TUTS的負載例如這一個

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM