0

// Это отредактированный код, который работает:Android MediaPlayer останавливается после игры в первый раз

Я пытался найти различные способы, чтобы исправить это, но похоже, что я должен попросить о помощи.

Медиаплеер воспроизводит файл в первый раз и больше никогда. Это код:

btn_default_acc = (ImageButton) layout.findViewById(R.id.btn_df_acc); 
     btn_default_acc.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       try {if(sentencePlayer==null){ 
         sentencePlayer = new MediaPlayer(); 
        }sentencePlayer.reset(); 
        sentencePlayer.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength()); 
        sentencePlayer.prepare(); 
        sentencePlayer.start(); 

       } catch (IllegalArgumentException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IllegalStateException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     }); 

     sentencePlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
      @Override 
      public void onCompletion(MediaPlayer sentencePlayer) { 
       sentencePlayer.stop(); 


      } 
     }); 

и LogCat: 01-11 13:28:36.744 9044-9044/com.testapp.imre.testapp W/System.err: java.lang.IllegalStateException 01-11 13:28:36.744 9044-9044/com.testapp.imre.testapp W/System.err: at android.media.MediaPlayer._setDataSource(Native Method) 01-11 13:28:36.744 9044-9044/com.testapp.imre.testapp W/System.err: at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1254) 01-11 13:28:36.744 9044-9044/com.testapp.imre.testapp W/System.err: at com.testapp.imre.testapp.Lesson1Reading$11.onClick(Lesson1Reading.java:1134) 01-11 13:28:36.744 9044-9044/com.testapp.imre.testapp W/System.err: at android.view.View.performClick(View.java:5156) 01-11 13:28:36.744 9044-9044/com.testapp.imre.testapp W/System.err: at android.view.View$PerformClick.run(View.java:20755) 01-11 13:28:36.744 9044-9044/com.testapp.imre.testapp W/System.err: at android.os.Handler.handleCallback(Handler.java:739) 01-11 13:28:36.744 9044-9044/com.testapp.imre.testapp W/System.err: at android.os.Handler.dispatchMessage(Handler.java:95) 01-11 13:28:36.744 9044-9044/com.testapp.imre.testapp W/System.err: at android.os.Looper.loop(Looper.java:145) 01-11 13:28:36.744 9044-9044/com.testapp.imre.testapp W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5832) 01-11 13:28:36.744 9044-9044/com.testapp.imre.testapp W/System.err: at java.lang.reflect.Method.invoke(Native Method) 01-11 13:28:36.744 9044-9044/com.testapp.imre.testapp W/System.err: at java.lang.reflect.Method.invoke(Method.java:372) 01-11 13:28:36.744 9044-9044/com.testapp.imre.testapp W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399) 01-11 13:28:36.744 9044-9044/com.testapp.imre.testapp W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)

Я также изменил метод, закрывающий экран:

private View.OnClickListener close_popup_screen_listener = new View.OnClickListener() { public void onClick(View v) { if (sentencePlayer != null){ sentencePlayer.stop(); } popUpScreen.dismiss(); try { fd.close(); } catch (IOException e) { e.printStackTrace(); } stopMediaRecorder(); } };

+1

После того как вы 'освобождения()' экземпляр 'MediaPlayer', он больше не может использоваться. Кроме того, если вы вызываете 'reset()' (но не 'release()'), вы должны повторно инициализировать его, прежде чем использовать его снова. –

+0

Я изменил код выше, и я все еще получаю сообщение об ошибке: java.lang.SecurityException at android.media.MediaPlayer._prepare (Native Method) – Immy

+0

Вы получаете эту ошибку, потому что вы закрыли 'FileDescriptor'. –

ответ

0

Попробуйте добавить предложениеPlayer.reset(); не

Перед setDataSource

+0

Сработало сочетание трех ответов. Я дам вам кредит. Спасибо. – Immy

0

Можете ли вы удалить ниже две строки?

sentencePlayer.reset(); 
sentencePlayer.release(); 

Ваш метод должно выглядеть следующим образом:

sentencePlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
     @Override 
     public void onCompletion(MediaPlayer sentencePlayer) { 
      sentencePlayer.stop(); 
     } 
    }); 

Edit 1:

Удалить ниже линии:

sentencePlayer.reset(); 

Добавить ниже строки:

if(sentencePlayer==null){ 
sentencePlayer = new MediaPlayer(); 
} 

Надеюсь, это вам поможет.

+0

Я пробовал. Это не сработало. – Immy

+0

@Immy. Какую ошибку вы получаете? –

+0

Я изменил приведенный выше код и получил следующее: java.lang.SecurityException at android.media.MediaPlayer._prepare (собственный метод) – Immy