Воспроизведение аудио файлов один за другим в Android - PullRequest
2 голосов
/ 25 мая 2011

Я использую следующий код для записи аудиофайлов и воспроизведения.У меня есть функция возобновления, которая начинает запись снова.Аудиофайлы хранятся в sdcard.Моя проблема в том, что файлы хранятся в sdcard, но файл воспроизводится один.Мне нужно воспроизвести все записанные файлы один за другим.Дайте предложения.У меня заканчивается время ...

ReadSDData.java

package com.fsp.audio;

import java.io.File;
import java.util.ArrayList;

import android.os.Environment;
import android.util.Log;

public class ReadSDDatas {
    public String filePath()
    {
        String newFolderName="/MyAudio";
        String extstoredir=Environment.getExternalStorageDirectory().toString();
        String newPath=extstoredir+newFolderName;
        return newPath;
    }

    public String getCombineFile()
    {
        String newFolderName="/MyComAudio";
        String extstoredir=Environment.getExternalStorageDirectory().toString();
        String path=extstoredir+newFolderName;
        File myNewPath=new File(path);
        if(!myNewPath.exists())
        {
            myNewPath.mkdir();
        }
        String audname="ComAudio";
        String ext=".3gp";
        File audio=new File(myNewPath,audname+ext);             

        if(audio.exists())
        {
            audio.delete();
        }
        String audpath=path+"/"+audname+ext;
        Log.d("Combined audio file",audpath);
        return audpath;
    }

    public ArrayList<String> getFileNames()
    {
        ArrayList<String> names=new ArrayList<String>();
        names.clear();
        String path=filePath();
        File f=new File(path);
        if(f.isDirectory())
        {
            File[] files=f.listFiles();
            for(int i=0;i<files.length;i++)
            {
                System.out.println("File Name======>>>"+files[i].getName());
                names.add(files[i].getName().toString().trim());
            }
        }
        return names;
    }

    public ArvrayList<String> getFullAudioPath()
    {
        ArrayList<String> fullPath=new ArrayList<String>();
        fullPath.clear();

        String path=filePath();
        File f=new File(path);
        if(f.isDirectory())
        {
            File[] files=f.listFiles();
            for(int i=0;i<files.length;i++)
            {
                String fpath=path+File.separator+files[i].getName().toString().trim();
                System.out.println("File Full Path======>>>"+fpath);
                fullPath.add(fpath);
            }
        }       
        return fullPath;
    }
}

AudioResume1.java

package com.fsp.audio;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.ArrayList;

import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class AudioResume1 extends Activity {
    ArrayList<String> audNames=new ArrayList<String>();
    ArrayList<String> audFullPath=new ArrayList<String>();
    byte fileContent[];

    Button record=null;
    Button stoprec=null;
    Button play=null;

    public MediaPlayer player=null;
    public MediaRecorder recorder=null;

    int cou=0;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        record=(Button)findViewById(R.id.recBtn);
        stoprec=(Button)findViewById(R.id.stopBtn);
        play=(Button)findViewById(R.id.playBtn);

        record.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v)
            {
                // TODO Auto-generated method stub
                System.out.println("********** Stated Recording **********");
                recorder=new MediaRecorder();
                recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);

                String path=audioFilePath();
                System.out.println("Recording Path===========>>>"+path);
                recorder.setOutputFile(path);
                recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                try 
                {
                    recorder.prepare();
                    recorder.start();
                }
                catch (IllegalStateException e) 
                {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } 
                catch (IOException e) 
                {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });

        stoprec.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v) 
            {
                // TODO Auto-generated method stub
                System.out.println("********** Stoped Recording **********");
                recorder.stop();
                recorder.release();
                recorder=null;

            }
        });

        play.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v) 
            {
                // TODO Auto-generated method stub
                getAudioNames();                
                readAudioAsStream();
            }
        });
    }

    public void readAudioAsStream()
    {
        getAudioPath();
        File f;
        FileInputStream ins = null;
        ReadSDDatas rds=new ReadSDDatas();
        try 
        {
            String comfile=rds.getCombineFile();
            //FileOutputStream fos=new FileOutputStream(comfile);
            Log.d("combined file",comfile);
            File file=new File(comfile);
            RandomAccessFile raf = new RandomAccessFile(file, "rw");
            Log.d("path size",Integer.toString(audFullPath.size()));
            for(int i=0;i<audFullPath.size();i++)
            {   
                String filepath=audFullPath.get(i);
                Log.d("Filepath",filepath);
                f=new File(audFullPath.get(i));
                 fileContent = new byte[(int)f.length()];
                ins=new FileInputStream(audFullPath.get(i));
                int numofbytes=ins.read(fileContent);
                System.out.println("Number Of Bytes Read===========>>>"+numofbytes);
                raf.seek(file.length());
                raf.write(fileContent);
            }
        }
        catch (FileNotFoundException e1)
        {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        playAudio();
        /*for(int i=0;i<audFullPath.size();i++)
        {
            Log.d("fullpathsize",Integer.toString(audFullPath.size()));
            playAudio(audFullPath.get(i));
        }*/

    }

    public void playAudio()
    {
        //Log.d("value of path",path);
        /*String newFolderName="/MyComAudio";
        String extstoredir=Environment.getExternalStorageDirectory().toString();
        String filename="ComAudio.3gp";
        String path1=extstoredir+newFolderName+filename;
        Log.d("path1",path1);*/
        String path="/sdcard/MyComAudio/ComAudio.3gp";
        player= new MediaPlayer();
        try
        {
            player.setDataSource(path);
            player.prepare();
            player.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();
        }
    }

    public void getAudioPath()
    {
        ReadSDDatas rds=new ReadSDDatas();
        audFullPath=rds.getFullAudioPath();
    }

    public void getAudioNames()
    {
        ReadSDDatas rds=new ReadSDDatas();
        audNames=rds.getFileNames();
    }

    public String audioFilePath()
    {           
        String newFolderName="/MyAudio";
        String extstoredir=Environment.getExternalStorageDirectory().toString();
        String path=extstoredir+newFolderName;
        File myNewPath=new File(path);
        if(!myNewPath.exists())
        {
            myNewPath.mkdir();
        }
        cou++;
        String audname="RecAudio";
        String ext=".3gp";
        File audio=new File(myNewPath,audname+Integer.toString(cou)+ext);               

        if(audio.exists())
        {
            audio.delete();
        }
        String audpath=path+File.separator+audname+Integer.toString(cou)+ext;

        return audpath;
    }
}

Ответы [ 2 ]

8 голосов
/ 25 мая 2011

Вы можете использовать MediaPlayer.onCompletionListener для прослушивания события, когда заканчивается дорожка, чтобы вы могли воспроизвести следующую

UPDATE

player.setDataSource(path);
player.prepare();
player.setOnCompletionListener(new OnCompletionListener() {

        @Override
        public void onCompletion(MediaPlayer player) {
            player.stop();

            // play next audio file

        }

    });
player.start();

ОБНОВЛЕНИЕ 2

Ваш код в комментарии не будет работать, это может быть решением:

int i = 0;
//somewhere in your activity you start playing your first file
playAudio("/sdcard/MyAudio/RecAudio"+i+".3gp");

public void playAudio(path) {
    player.setDataSource(path);
    player.prepare();
    player.setOnCompletionListener(new OnCompletionListener() {
        @Override public void onCompletion(MediaPlayer mp) {
            player.stop();
            if(i < numberOfFiles) {
                i++;
                playAudio("/sdcard/MyAudio/RecAudio"+i+".3gp");
            } else i = 0;
        }
    });
    player.start();
}
0 голосов
/ 13 сентября 2013

Да, этот код будет работать нормально, но я реализовал по-другому, и он будет работать лучше, чем данный код, потому что, если вы воспроизводите следующий файл внутри метода setOnCompletionListener, он будет вызываться только один раз, то есть при воспроизведении первого файла он будет вызывать метод завершенияВоспроизведите другой файл, но на этот раз он не будет вызываться, поэтому вам нужно создать новый экземпляр.не беспокойтесь, просто забудьте использовать это

mc = new CountDownTimer(cownDownTime, 1000) {
        public void onFinish() {
            Log.i("call data hrer","aao bhai");
            //initlize();
            //updateText();
            //startPlayProgressUpdater();
        }

, то есть воспроизводить следующий файл в методе таймера обратного отсчета окончания (), он будет работать эффективно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...