Android媒体播放器无法正常工作

时间:2013-08-09 11:43:42

标签: android

我创建了一个实时接收消息的活动。有时消息只是一个通知,有时消息会弹出是/否警告对话框。 我想为此创建一个10秒的声音通知,所以我在课堂上宣布。 我让媒体播放器全球化,以便每当我需要播放声音时都不会创建它。

final MediaPlayer mediaPlayer = new MediaPlayer();
final Handler handler = new Handler();

我在activity oncreate中设置数据源

try {
        mediaPlayer.setDataSource(getBaseContext(), defaultRingtoneUri);
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_RING);

    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (SecurityException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

然后当我收到我在onnewintent

中的消息时
 try {
        mediaPlayer.prepare();
        mediaPlayer.start();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                if (mediaPlayer.isPlaying())
                    {
                    mediaPlayer.stop();
                    }
            }
        }, 10000);
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (SecurityException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

最后在点击alertdialog时停止提醒声音

 DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    switch (which){
                    case DialogInterface.BUTTON_POSITIVE:
                        //Yes button clicked
                        response = "1";
                        Log.v("Yes button clicked", response);
                        //some code
                        if(mediaPlayer.isPlaying())
                            mediaPlayer.stop();
                        break;

                    case DialogInterface.BUTTON_NEGATIVE:
                        //No button clicked
                        response = "-1";
                        Log.v("No button clicked", response);
                        //some code
                        if(mediaPlayer.isPlaying())
                            mediaPlayer.stop();
                        break;
                    }
                }
            };

我一直在测试这个。在xperia p上一直有预期的行为。没问题。今天我得到了一个新的熔岩虹膜(它有一个更小的ROM 512M)。在第一条消息上它播放声音,但之后我在使用status=0xFFFFFF8E

准备时出现IOexception错误

关于我在这里做错了什么的任何想法?如果为此目的采用更清洁的方式,我将愿意改变实施。

 01-01 09:53:54.813: D/YourActivity(15988): onNewIntent is called!
 01-01 09:53:54.816: W/System.err(15988): java.io.IOException: Prepare failed.: status=0xFFFFFF8E
01-01 09:53:54.818: W/System.err(15988):    at android.media.MediaPlayer.prepare(Native Method)
01-01 09:53:54.822: W/System.err(15988):    at com.example.delmole.OrderActivity.onNewIntent(OrderActivity.java:309)
01-01 09:53:54.822: W/System.err(15988):    at      android.app.Instrumentation.callActivityOnNewIntent(Instrumentation.java:1156)
01-01 09:53:54.823: W/System.err(15988):    at android.app.ActivityThread.deliverNewIntents(ActivityThread.java:2464)
01-01 09:53:54.823: W/System.err(15988):    at android.app.ActivityThread.performNewIntents(ActivityThread.java:2477)
01-01 09:53:54.823: W/System.err(15988):    at  android.app.ActivityThread.handleNewIntent(ActivityThread.java:2486)
01-01 09:53:54.823: W/System.err(15988):    at android.app.ActivityThread.access$1400(ActivityThread.java:162)
01-01 09:53:54.824: W/System.err(15988):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1435)
01-01 09:53:54.824: W/System.err(15988):    at android.os.Handler.dispatchMessage(Handler.java:107)
01-01 09:53:54.824: W/System.err(15988):    at android.os.Looper.loop(Looper.java:194)
01-01 09:53:54.824: W/System.err(15988):    at    android.app.ActivityThread.main(ActivityThread.java:5371)
01-01 09:53:54.825: W/System.err(15988):    at java.lang.reflect.Method.invokeNative(Native Method)
01-01 09:53:54.825: W/System.err(15988):    at java.lang.reflect.Method.invoke(Method.java:525)
01-01 09:53:54.826: W/System.err(15988):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
01-01 09:53:54.826: W/System.err(15988):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
01-01 09:53:54.827: W/System.err(15988):    at dalvik.system.NativeStart.main(Native Method)

1 个答案:

答案 0 :(得分:0)

在你的代码中声明 - mediaPlayer.prepare();导致错误,因为第一次播放通知声音时媒体播放器对象已经准备好了。

尝试在onCreate方法中放置此语句,以便每次调用onnewintent时,此语句只执行一次。

另一种可能的解决方案是 -

写mediaPlayer.reset();在mediaPlayer.prepare()之前;在onnewintent方法

它会将mediaplayer对象的状态更改为idle,并且prepare语句中没有问题。