[英]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.