AndroidMediaplayer.create冻结(仍在运行但不做任何事情)应用

时间:2018-01-12 19:48:11

标签: android android-mediaplayer freeze

我正在使用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;错误日志退出:

enter image description here

2 个答案:

答案 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();