我正在使用MediaPlayer在我的应用程序中播放声音,但是从它开始冻结App:
这就是我调用create方法的代码。我将代码移到了AsyncTask类中:
public class BackgroundSound extends AsyncTask<Integer,Void,Void> {
MediaPlayer mpB;
MediaPlayer mpG;
Context ctx;
BackgroundSound(Context appctx)
{
ctx = appctx;
}
@Override
protected Void doInBackground(Integer... Params) {
switch (Params[0]){
case 0:
mpB = MediaPlayer.create(ctx, R.raw.sonidoemocion5sec);
mpB.setLooping(true);
mpB.setVolume(0.75f, 0.75f);
mpB.start();
break;
case 1:
if (mpG != null)
{
mpG.release();
mpG = null;
}
mpG = MediaPlayer.create(ctx, R.raw.ganador);
mpG.setVolume(1, 1);
mpG.start();
break;
case 2:
if (mpG != null){
mpG.release();
mpG = null;
}
mpG = MediaPlayer.create(ctx, R.raw.perder);
mpG.setVolume(1, 1);
mpG.start();
break;
}
return null;
}
}
Debuging我发现冻结(app仍在运行,但没有做任何事情)发生在方法内的新行中,从MediaPlayer.java文件创建::
public static MediaPlayer create(Context context, Uri uri, SurfaceHolder holder,
AudioAttributes audioAttributes, int audioSessionId) {
try {
MediaPlayer mp = new MediaPlayer();
我不明白发生了什么。有什么提示吗?
警告&amp;错误日志退出:
答案 0 :(得分:0)
不使用MediaPlayer.create()
,而是使用mp.setDataSource()
方法,以便您可以调用mp.prepareAsync()
,然后设置侦听器以监听其完成情况,如下所示:
mp.setDataSource(this, audioUri);
mp.prepareAsync();
mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
现在对于audioUri
的{{1}}对象,您可以通过在项目中使用以下代码行将其设置为Uri
文件夹中的音频文件:
raw
此方法异步准备audioUri = Uri.parse("android.resource://com.yourpackagename/" + R.raw.your_audiofile_name);
并且不阻止UI
答案 1 :(得分:0)
此问题有两个可能的解决方案,但由于我尚未对其进行测试,因此无法确定它是否正常工作。
解决方案1。
替换以下行:
audiojuego = MediaPlayer.create(this, R.raw.sonidoemocion);
使用:
audiojuego = MediaPlayer.create(getApplicationContext(), R.raw.sonidoemocion);
//As you are calling from doInBackground() method, this will not work properly.
解决方案2。
以您自己的方式初始化媒体播放器,而不是默认。
Uri url=Uri.parse("android.resource://"+getPackageName()+"/raw/sonidoemocion");
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(url);
mediaPlayer.prepare(); // might take long! (for buffering, etc)
mediaPlayer.start();