2013-08-09 2 views
0

Я создал активность, которая получает сообщения в реальном времени. Иногда сообщение является просто уведомлением, а другое сообщение вызывает диалог «Да/Нет». Я хотел создать 10-секундное звуковое уведомление для этого, поэтому я объявил в классе. Я сделал mediaplayer глобальным, чтобы не создавать его каждый раз, когда мне нужно играть в звук.Android mediaplayer не работает

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

Я установил источник данных в деятельности 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). При первом сообщении он воспроизводит звук, но потом я получаю сообщение об ошибке IOexception при подготовке с status=0xFFFFFF8E

Любые идеи о том, что я делаю неправильно здесь? Я буду открыт для изменения реализации, если для этой цели существует более чистый способ.

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) 
+0

Пожалуйста, пометьте полную ошибку в LogCat –

+0

что такое OrderActivity? Можете ли вы рассказать нам, что там в строке 309? – Opiatefuchs

+0

строка 309 - mediaPlayer.prepare(); Я уже дал код выше для этого в блоке try –

ответ

0

в вашем коде заявление - mediaPlayer.prepare(); вызывает ошибку, поскольку объект медиапланера уже готов, когда звук уведомления воспроизводится в первый раз.

Попробуйте поместить этот оператор в метод onCreate, чтобы этот оператор выполнялся только один раз не каждый раз, когда вызывается onnewintent.

Другим возможным решением является -

записи mediaPlayer.reset(); перед mediaPlayer.prepare(); в onnewintent метод

Он изменит состояние объекта медиапланера на холостой ход, и в инструкции подготовки не будет проблем.

+0

добавлено готовить в oncreate. теперь у меня только есть .start и .stop звонки, когда я получаю сообщения. но теперь это дает мне erro, говорящий, что начало вызвано в состоянии 0; ошибка (-38,0) –

+0

использование mediaPlayer.prepareAsync(); вместо mediaPlayer.prepare(); –

+0

не работает. вместо остановки я останавливаюсь и начинаю сейчас. Кажется, это сработало. –

Смежные вопросы