Непрерывное воспроизведение аудиофайлов из каталога

#android #audio

#Android #Аудио

Вопрос:

Я использую следующий код для непрерывного воспроизведения аудиофайлов из каталога на sdcard.

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

 mPlay.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View v) 
            {
                // TODO Auto-generated method stub
            getFiles();
            }

            private void getFiles() {
                // TODO Auto-generated method stub
                File dir = new File("/sdcard/sdcard");
                 int index=0;
                 String[] children = dir.list();
                 for(int i=0;i<children.length;i  )
                 {
                     String filename=children[i];
                     playAudio(filename);
                 }
            }

            private void playAudio(String filename) {
                // TODO Auto-generated method stub
                 mPlayer = new MediaPlayer();
                    try {
                        mPlayer.setDataSource(filename);
                    } catch (IllegalArgumentException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    } catch (IllegalStateException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    } catch (IOException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
                    try {
                        mPlayer.prepare();
                    } catch (IllegalStateException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    } catch (IOException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
                    mPlayer.start();
                    mSeekBar.setMax(mPlayer.getDuration());
                    new Thread(new Runnable(){

@Override
public void run() 
{
// TODO Auto-generated method stub
while(mPlayer!=null amp;amp; mPlayer.getCurrentPosition() <mPlayer.getDuration())
    {
Log.d("Indide Run Method",Integer.toString(mPlayer.getCurrentPosition()));
    try 
    {
          Thread.sleep(100);
     } 
catch (InterruptedException e) 
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
        }
                                mSeekBar.setProgress(mPlayer.getCurrentPosition());
                            }   


                        }

                    }
                    ).start();
                    mSeekBar.setProgress(mPlayer.getCurrentPosition());

        pauseRecord.setVisibility(View.INVISIBLE);  


            }

        });
  

Как можно решить проблему?

 05-24 18:34:19.455: DEBUG/MediaPlayer(19961):     at dalvik.system.NativeStart.main(Native Method)
05-24 18:34:19.465: WARN/dalvikvm(19961): threadid=3: thread exiting with uncaught exception (group=0x2aadda10)
05-24 18:34:19.465: ERROR/AndroidRuntime(19961): Uncaught handler: thread main exiting due to uncaught exception
**05-24 18:34:19.465: ERROR/AndroidRuntime(19961): java.lang.NullPointerException
05-24 18:34:19.465: ERROR/AndroidRuntime(19961):     at com.fsp.audio.resume.AudioResume.playChild(AudioResume.java:402)
05-24 18:34:19.465: ERROR/AndroidRuntime(19961):     at com.fsp.audio.resume.AudioResume.playlist(AudioResume.java:393)
05-24 18:34:19.465: ERROR/AndroidRuntime(19961):     at com.fsp.audio.resume.AudioResume.access$0(AudioResume.java:391)
05-24 18:34:19.465: ERROR/AndroidRuntime(19961):     at com.fsp.audio.resume.AudioResume$1.onClick(AudioResume.java:132)
05-24 18:34:19.465: ERROR/AndroidRuntime(19961):     at android.view.View.performClick(View.java:2347)
05-24 18:34:19.465: ERROR/AndroidRuntime(19961):     at android.view.View.onTouchEvent(View.java:4185)
05-24 18:34:19.465: ERROR/AndroidRuntime(19961):     at android.widget.TextView.onTouchEvent(TextView.java:6521)
05-24 18:34:19.465: ERROR/AndroidRuntime(19961):     at android.view.View.dispatchTouchEvent(View.java:3717)**
05-24 18:34:19.465: ERROR/AndroidRuntime(19961):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:882)
05-24 18:34:19.465: ERROR/AndroidRuntime(19961):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:882)
05-24 18:34:19.465: ERROR/AndroidRuntime(19961):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:882)
05-24 18:34:19.465: ERROR/AndroidRuntime(19961):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:882)
05-24 18:34:19.465: ERROR/AndroidRuntime(19961):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:882)
05-24 18:34:19.465: ERROR/AndroidRuntime(19961):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1712)
05-24 18:34:19.465: ERROR/AndroidRuntime(19961):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1202)
05-24 18:34:19.465: ERROR/AndroidRuntime(19961):     at android.app.Activity.dispatchTouchEvent(Activity.java:1987)
05-24 18:34:19.465: ERROR/AndroidRuntime(19961):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1696)
05-24 18:34:19.465: ERROR/AndroidRuntime(19961):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1659)
05-24 18:34:19.465: ERROR/AndroidRuntime(19961):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-24 18:34:19.465: ERROR/AndroidRuntime(19961):     at android.os.Looper.loop(Looper.java:123)
05-24 18:34:19.465: ERROR/AndroidRuntime(19961):     at android.app.ActivityThread.main(ActivityThread.java:4203)
05-24 18:34:19.465: ERROR/AndroidRuntime(19961):     at java.lang.reflect.Method.invokeNative(Native Method)
05-24 18:34:19.465: ERROR/AndroidRuntime(19961):     at java.lang.reflect.Method.invoke(Method.java:521)
05-24 18:34:19.465: ERROR/AndroidRuntime(19961):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:799)
05-24 18:34:19.465: ERROR/AndroidRuntime(19961):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
05-24 18:34:19.465: ERROR/AndroidRuntime(19961):     at dalvik.system.NativeStart.main(Native Method)
05-24 18:34:21.435: ERROR/dun_service(19989): Unable to open external port /dev/ttyHSUSB0 : No such device
05-24 18:34:26.465: ERROR/dun_service(19991): Unable to open external port /dev/ttyHSUSB0 : No such device
05-24 18:34:31.495: ERROR/dun_service(19993): Unable to open external port /dev/ttyHSUSB0 : No such device
05-24 18:34:36.525: ERROR/dun_service(19995): Unable to open external port /dev/ttyHSUSB0 : No such device
  

Ответ №1:

Для воспроизведения одного файла за другим вы можете использовать MediaPlayer.OnCompletionListener :

 final MediaPlayer mp1 = new MediaPlayer();
mp1.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp1.setDataSource(file1);
mp1.prepare();
mp1.start();

mp1.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
    @Override
    public void onCompletion(MediaPlayer mp) {
        mp1.release();
        //file 1 has played, now play the second
    }
});