简体   繁体   English

如何使用MediaPlayer(android)同时播放两个或更多音频剪辑

[英]How to play two or more audio clips simultaneously using MediaPlayer (android)

I and my friend are creating an android app. 我和我的朋友正在创建一个android应用。 We almost did it... The app will play two sounds simultaneously at first run, but in the second run it will throw some errors and attains ANR state. 我们几乎做到了...该应用程序在第一次运行时将同时播放两种声音,但在第二次运行时它将引发一些错误并达到ANR状态。 How to fix this? 如何解决这个问题? Check the logcat and code below. 检查下面的logcat和代码。

Code

import java.io.IOException;

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

public class MainActivity extends Activity implements OnClickListener,Runnable {

    boolean mBound = false;
    Button btn1,btn2;
    Button btn3;
    Button btn4;
    MediaPlayer yourStereo;

    MediaPlayer myStereo;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         btn1=(Button)findViewById(R.id.a_button);
         btn2=(Button)findViewById(R.id.b_button);
         btn3=(Button)findViewById(R.id.c_button);
         btn4=(Button)findViewById(R.id.d_button);


        btn1.setOnClickListener(this);
        myStereo = MediaPlayer.create(this, R.raw.brb);
        btn3.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                btn3.setVisibility(Button.GONE);
                btn4.setVisibility(Button.VISIBLE);
                // TODO Auto-generated method stub



                        try {
                            myStereo.prepare();
                        } catch (IllegalStateException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        myStereo.setLooping(true);
                        myStereo.start();
                        myStereo.setOnCompletionListener(new OnCompletionListener() {

                            @Override
                            public void onCompletion(MediaPlayer mp) {
                                // TODO Auto-generated method stub
                                myStereo.setLooping(true);
                                myStereo.release();
                                try {
                                    myStereo.prepare();
                                } catch (IllegalStateException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                } catch (IOException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                }
                                myStereo.start();
                            }
                        });
                        // pause music here

                        btn4.setOnClickListener(new View.OnClickListener() {

                            @Override
                            public void onClick(View v) {
                                // TODO Auto-generated method stub
                                myStereo.stop();
                                btn4.setVisibility(Button.GONE);
                                btn3.setVisibility(Button.VISIBLE);

                            }
                        });
            }
        });



    }

    @Override
    public void onClick(View arg0) {
            // play music here
            btn1.setVisibility(Button.GONE);
            btn2.setVisibility(Button.VISIBLE);
            // TODO Auto-generated method stub
            yourStereo = MediaPlayer.create(this, R.raw.pl);
            yourStereo.setLooping(true);
            try {
                yourStereo.prepare();
            } catch (IllegalStateException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
                    yourStereo.start();
                    yourStereo.setOnCompletionListener(new OnCompletionListener() {

                        @Override
                        public void onCompletion(MediaPlayer mp) {
                            // TODO Auto-generated method stub
                            yourStereo.setLooping(true);
                            yourStereo.release();
                            try {
                                yourStereo.prepare();
                            } catch (IllegalStateException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                            yourStereo.start();
                        }
                    });
            // pause music here

            btn2.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    yourStereo.stop();
                    btn2.setVisibility(Button.GONE);
                    btn1.setVisibility(Button.VISIBLE);

                }
            });
    }


    @Override
    public void run() {
        // TODO Auto-generated method stub

    }

}

Logcat logcat的

07-08 11:44:17.245: W/System.err(2659): java.lang.IllegalStateException
07-08 11:44:17.261: W/System.err(2659):     at android.media.MediaPlayer.prepare(Native Method)
07-08 11:44:17.261: W/System.err(2659):     at com.example.sleepsimulator.MainActivity$1.onClick(MainActivity.java:49)
07-08 11:44:17.269: W/System.err(2659):     at android.view.View.performClick(View.java:2485)
07-08 11:44:17.269: W/System.err(2659):     at android.view.View$PerformClick.run(View.java:9080)
07-08 11:44:17.269: W/System.err(2659):     at android.os.Handler.handleCallback(Handler.java:587)
07-08 11:44:17.269: W/System.err(2659):     at android.os.Handler.dispatchMessage(Handler.java:92)
07-08 11:44:17.269: W/System.err(2659):     at android.os.Looper.loop(Looper.java:130)
07-08 11:44:17.269: W/System.err(2659):     at android.app.ActivityThread.main(ActivityThread.java:3687)
07-08 11:44:17.269: W/System.err(2659):     at java.lang.reflect.Method.invokeNative(Native Method)
07-08 11:44:17.269: W/System.err(2659):     at java.lang.reflect.Method.invoke(Method.java:507)
07-08 11:44:17.269: W/System.err(2659):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
07-08 11:44:17.269: W/System.err(2659):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
07-08 11:44:17.269: W/System.err(2659):     at dalvik.system.NativeStart.main(Native Method)
07-08 11:44:20.534: W/KeyCharacterMap(2659): Can't open keycharmap file
07-08 11:44:20.534: W/KeyCharacterMap(2659): Error loading keycharmap file
07-08 11:44:20.534: W/KeyCharacterMap(2659): Using default keymap
07-08 11:44:26.636: W/System.err(2659): java.io.IOException: Prepare failed.: status=0xFFFFFF8E
07-08 11:44:26.636: W/System.err(2659):     at android.media.MediaPlayer.prepare(Native Method)
07-08 11:44:26.636: W/System.err(2659):     at com.example.sleepsimulator.MainActivity$1.onClick(MainActivity.java:49)
07-08 11:44:26.636: W/System.err(2659):     at android.view.View.performClick(View.java:2485)
07-08 11:44:26.636: W/System.err(2659):     at android.view.View$PerformClick.run(View.java:9080)
07-08 11:44:26.636: W/System.err(2659):     at android.os.Handler.handleCallback(Handler.java:587)
07-08 11:44:26.636: W/System.err(2659):     at android.os.Handler.dispatchMessage(Handler.java:92)
07-08 11:44:26.636: W/System.err(2659):     at android.os.Looper.loop(Looper.java:130)
07-08 11:44:26.636: W/System.err(2659):     at android.app.ActivityThread.main(ActivityThread.java:3687)
07-08 11:44:26.636: W/System.err(2659):     at java.lang.reflect.Method.invokeNative(Native Method)
07-08 11:44:26.636: W/System.err(2659):     at java.lang.reflect.Method.invoke(Method.java:507)
07-08 11:44:26.636: W/System.err(2659):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
07-08 11:44:26.636: W/System.err(2659):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
07-08 11:44:26.636: W/System.err(2659):     at dalvik.system.NativeStart.main(Native Method)
07-08 11:44:26.636: E/MediaPlayer(2659): start called in state 64
07-08 11:44:26.636: E/MediaPlayer(2659): error (-38, 0)
07-08 11:44:34.643: E/MediaPlayer(2659): stop called in state 0
07-08 11:44:34.643: E/MediaPlayer(2659): error (-38, 0)
07-08 11:44:34.643: E/MediaPlayer(2659): Error (-38,0)
07-08 11:44:34.651: W/System.err(2659): java.lang.IllegalStateException
07-08 11:44:34.675: W/System.err(2659):     at android.media.MediaPlayer.prepare(Native Method)
07-08 11:44:34.675: W/System.err(2659):     at com.example.sleepsimulator.MainActivity$1$1.onCompletion(MainActivity.java:67)
07-08 11:44:34.675: W/System.err(2659):     at android.media.MediaPlayer$EventHandler.handleMessage(MediaPlayer.java:1475)
07-08 11:44:34.675: W/System.err(2659):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-08 11:44:34.675: W/System.err(2659):     at android.os.Looper.loop(Looper.java:130)
07-08 11:44:34.675: W/System.err(2659):     at android.app.ActivityThread.main(ActivityThread.java:3687)
07-08 11:44:34.675: W/System.err(2659):     at java.lang.reflect.Method.invokeNative(Native Method)
07-08 11:44:34.675: W/System.err(2659):     at java.lang.reflect.Method.invoke(Method.java:507)
07-08 11:44:34.675: W/System.err(2659):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
07-08 11:44:34.675: W/System.err(2659):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
07-08 11:44:34.675: W/System.err(2659):     at dalvik.system.NativeStart.main(Native Method)
07-08 11:44:34.675: W/dalvikvm(2659): threadid=1: thread exiting with uncaught exception (group=0x40018578)
07-08 11:44:34.683: E/AndroidRuntime(2659): FATAL EXCEPTION: main
07-08 11:44:34.683: E/AndroidRuntime(2659): java.lang.IllegalStateException
07-08 11:44:34.683: E/AndroidRuntime(2659):     at android.media.MediaPlayer._start(Native Method)
07-08 11:44:34.683: E/AndroidRuntime(2659):     at android.media.MediaPlayer.start(MediaPlayer.java:950)
07-08 11:44:34.683: E/AndroidRuntime(2659):     at com.example.sleepsimulator.MainActivity$1$1.onCompletion(MainActivity.java:75)
07-08 11:44:34.683: E/AndroidRuntime(2659):     at android.media.MediaPlayer$EventHandler.handleMessage(MediaPlayer.java:1475)
07-08 11:44:34.683: E/AndroidRuntime(2659):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-08 11:44:34.683: E/AndroidRuntime(2659):     at android.os.Looper.loop(Looper.java:130)
07-08 11:44:34.683: E/AndroidRuntime(2659):     at android.app.ActivityThread.main(ActivityThread.java:3687)
07-08 11:44:34.683: E/AndroidRuntime(2659):     at java.lang.reflect.Method.invokeNative(Native Method)
07-08 11:44:34.683: E/AndroidRuntime(2659):     at java.lang.reflect.Method.invoke(Method.java:507)
07-08 11:44:34.683: E/AndroidRuntime(2659):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
07-08 11:44:34.683: E/AndroidRuntime(2659):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
07-08 11:44:34.683: E/AndroidRuntime(2659):     at dalvik.system.NativeStart.main(Native Method)

The error you are getting is due to calling .release() followed by .prepare() in your onCompletionListener 您收到的错误是由于在onCompletionListener调用.release()然后调用.release() .prepare()

.release() releases all resources and should really only be called if you don't want to use the MediaPlayer at all any more, for example, on exit of your app. .release()释放所有资源,并且实际上仅在您不想再使用MediaPlayer时才应调用它,例如,在应用程序退出时。

http://developer.android.com/reference/android/media/MediaPlayer.html#release() http://developer.android.com/reference/android/media/MediaPlayer.html#release()

Therefore your call to .prepare() after .release() is failing because it doesn't know what to prepare. 因此您的来电.prepare().release()失败,因为它不知道哪些准备。

If you're just playing the same file again you can just call .start() again onCompletion. 如果您只是再次播放同一文件,则可以再次在onCompletion上调用.start() I believe it'll seek back to the beginning. 我相信它将重新开始。 No need to release and prepare again. 无需释放并再次准备。

Also if you are using .create() there is no need to call .prepare() at all as it will already be in a prepared state. 同样,如果您使用的是.create() ,则根本不需要调用.prepare() ,因为它已经处于准备状态。

http://developer.android.com/reference/android/media/MediaPlayer.html#create(android.content.Context, android.net.Uri, android.view.SurfaceHolder) http://developer.android.com/reference/android/media/MediaPlayer.html#create(android.content.Context、android.net.Uri、android.view.SurfaceHolder)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM